C’est parce qu’on ne travaille pas dans un système de types simpliste, comme le lambda calcul simplement typé. Il y a plusieurs kinds, qui sont des constructeurs de types (juste deux en Haskell, ceux d’arité 0 ou 1, les autres sont obtenus par curryfication). Ici tes Int et b sont de kind*, mais m est de kind* -> *, j’imagine. Plus d’infos dans le classique TAPL de Pierce,
Pour simplifier, c’est pareil qu’en C, tu ne peux pas écrire qu’une fonction prend en paramètre un tableau, sans spécifier le type de ses éléments (pas de func (int x, [] y)). En Haskell, tu peux quand même généraliser avec forall a. func :: Int -> Monad a par exemple. (En C, on doit outrepasser le système de types par des casts).
[^] # Re: cat troll.hs
Posté par neil . En réponse à la dépêche Sortie du Glorious Haskell Compiler 7.8. Évalué à 4. Dernière modification le 01 mai 2014 à 18:17.
C’est parce qu’on ne travaille pas dans un système de types simpliste, comme le lambda calcul simplement typé. Il y a plusieurs kinds, qui sont des constructeurs de types (juste deux en Haskell, ceux d’arité 0 ou 1, les autres sont obtenus par curryfication). Ici tes
Intetbsont de kind*, maismest de kind* -> *, j’imagine. Plus d’infos dans le classique TAPL de Pierce,Pour simplifier, c’est pareil qu’en C, tu ne peux pas écrire qu’une fonction prend en paramètre un tableau, sans spécifier le type de ses éléments (pas de
func (int x, [] y)). En Haskell, tu peux quand même généraliser avecforall a. func :: Int -> Monad apar exemple. (En C, on doit outrepasser le système de types par des casts).