28 votes

Qu'est-ce que cette syntaxe haskell ?

Je viens de tomber sur la syntaxe suivante dans un morceau de code Haskell -

data A = A Int Int | B

m :: A -> Int
m a = case a of
  A{} -> 1
  _ -> 2

Qu'est-ce que la A{} ici ? Est-ce que le {} automatiquement pour n'importe quel nombre d'arguments ?

J'ai l'impression que cela exploite le fait que la syntaxe d'enregistrement de Haskell se résume à un ensemble de fonctions et à un type de données algébrique normal. Est-ce le cas ?

28voto

Daniel Fischer Points 114146

Oui, A{} correspond à toute valeur construite avec la méthode A que le type ait été déclaré avec la syntaxe d'enregistrement ou non.

Les rapport linguistique précise

L'expression F {}, où F est un constructeur de données, est légale, que F ait été déclaré ou non avec la syntaxe d'enregistrement (à condition que F n'ait pas de champs stricts - voir le quatrième point ci-dessus) ; elle dénote F ⊥1 ⊥n, où n est l'arité de F.

Le "quatrième point" mentionné dans la parenthèse indique que la construction d'une valeur avec une syntaxe d'enregistrement qui omet un champ strict constitue une erreur statique.

Et dans la section correspondance des modèles L'une des règles de grammaire pour les motifs est la suivante

apat -> qcon { fpat1 , … , fpatk }      (labeled pattern, k ≥ 0)

et la sémantique est donnée dans la sous-section sur la sémantique formelle du pattern-matching (3.17.3) comme suit

(o) case  v  of {  K  {} ->  e ; _ ->  e′ }
        = case  v  of {
            K _… _ ->  e ; _ ->  e′ }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X