3 votes

Que signifie data (->) a b ?

Pour (->) nous avons :

Prelude> :i (->)
data (->) t1 t2         -- Defined in ‘GHC.Prim’

Que signifie cette syntaxe ? Je pensais que le mot-clé de déclaration de données nécessitait un constructeur de type sur la ligne LHS et un ou plusieurs constructeurs de valeur sur la ligne RHS ?

Et comment (->) est-il généralement parlé ou prononcé ?

12voto

Tikhon Jelvis Points 30789

(->) est le type de fonction et les gens le prononcent généralement comme "to" (c'est-à-dire a -> b se prononcerait "a à b").

(->) est une construction primitive intégrée à GHC : le compilateur la gère spécialement. Cependant, certains outils comme :i qui travaillent avec des types normaux voient une fausse définition de (->) comme s'il s'agissait d'un type de données vide :

data (->) a b

Cela permet :i pour vous donner des informations sur une opération intégrée comme s'il s'agissait d'une définition normale.

En (->) a b est la version préfixe d'un nom infixe, tout comme vous pouvez définir des opérateurs normaux sous forme de préfixe :

a ~+ b = a * b + b

est identique à

(~+) a b = a * b + b

Si vous essayez réellement de définir (->) de cette manière, vous obtiendriez une erreur :

<interactive>:20:1-13: error:
    Illegal binding of built-in syntax: (->)

Cependant, vous peut définir vous-même des types de données vides comme celui-ci si vous leur donnez un nom valide :

data Foo a b

Ce qui fait que Foo un type avec deux arguments (fantômes) qui n'a pas d'autres valeurs que ⊥, tout comme Void de Data.Void .

Si vous voulez jouer avec la syntaxe infixe, vous pouvez définir un opérateur de type avec l'option TypeOperators l'extension est activée, avec la même signification que Foo :

data a +~ b

ou

data (+~) a b

Cela peut être utile si, par exemple, nous voulons émuler OCaml et écrire des paires de caractères sous forme de a * b plutôt que (a, b) :

type a * b = (a, b)

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