2017-09-14 12 views
4

Y a-t-il une différence entre les deux types "a" et "t" dans la signature de type Haskell ou sa seule désignation différente comme le type "a" et le type "b"?Quelle est la différence entre le type "a" et le type "t" dans la signature de type Haskell?

dans le type https://www.haskell.org/tutorial/goodies.html [a] est défini comme suit:

[a] est la famille des types consistant en un pour chaque type, le type des listes d'un. Les listes d'entiers (par exemple [1,2,3]), les listes de caractères (['a', 'b', 'c']), même les listes de listes d'entiers, etc., sont tous membres de cette famille. (Notez, cependant, que [2, 'b'] n'est pas un exemple valide, car il n'y a pas de type unique qui contient à la fois 2 et «b.)

Cette définition est également appliquée pour le type" t "?

un exemple pourrait être:

foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b 
    app :: [t] -> t -> [t] 
+1

Cela dépend s'il existe une restriction de type dans la signature correspondant à ces symboles. Montre la signature en question. – Carcigenicate

+3

Non, si les variables de type ne se produisent pas dans les contraintes de type, ce ne sont que des variables. Le nom de ces variables est arbitraire. Mais parfois un nom plus sémantique peut être utile. Comme 'n' pour nombre, etc. –

+3

Pas une réponse complète mais peut-être il est utile de savoir que' foldl :: Pliable t => (b -> a -> b) -> b -> ta -> b' est équivalent à 'foldl :: Pliable x => (y -> z -> y) -> y -> xz -> y' et' app :: [t] -> t -> [t] 'équivaut à' app :: [u] -> u -> [u] ' – TobiMcNamobi

Répondre

2

Dans les définitions de type Haskell, les noms de type commencent toujours par des lettres majuscules, alors que les variables de type commencent toujours avec des lettres minuscules. Ceux-ci sont normalement appelés a, b, et ainsi de suite, mais peuvent également être appelés f, m, t, et ainsi de suite.

Souvent, les lettres du début de l'alphabet sont utilisées pour les variables de type non bornées, alors que vous voyez souvent des variables de type plus spécifiques annotées f, m, t, et ainsi de suite.

Dans l'exemple particulier

foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b 

t est spécifiquement désignés comme étant une instance de la classe de type Foldable. t a signifie un «conteneur» Foldable qui contient des valeurs du type a.

Quand vous regardez votre autre exemple

app :: [t] -> t -> [t] 

il pourrait aussi bien dire [a] -> a -> [a], si app est une fonction « autoportant ». Si, d'autre part, app appartient à une classe de type, cette définition de classe de type pourrait contenir une définition plus spécifique de t.