(->)
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)