D'abord, il y a une faute de frappe dans votre appel récursif à lengthZ
. En corrigeant cela, nous rencontrons une nouvelle erreur de type :
Aucune instance pour (Num a)
Ce que cela nous dit, c'est qu'afin d'utiliser la fonction (+)
nous devons inclure la classe de type Num
comme une contrainte dans notre déclaration de type. Nous incluons également une variable de type différent pour les éléments de la liste afin que la fonction puisse être appliquée à des listes contenant des éléments de n'importe quel type. Nous réécrivons donc la fonction comme suit :
lengthz :: Num b => [a] -> b
lengthz [] = 0
lengthz n = 1 + lengthz (tail n)
Ce qui fonctionne comme prévu :
ghci>> lengthz [1,2,3]
3
ghci>> lengthz []
0