3 votes

Définition d'une fonction de longueur à l'aide de la queue

Je suis assez nouveau dans Haskell et j'essaie de définir ma propre fonction de longueur comme suit :

lengthz :: [a] -> a lengthz [] = 0 lengthz n = 1 + length (tail n)

Pourquoi cela ne compile-t-il pas ? Et ou, y a-t-il quelque chose qui ne va pas dans ma logique ?

Merci !

5voto

mnoronha Points 2445

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

3voto

AlexJ136 Points 880

Le type de votre lengthz La fonction est [a] -> a .

Cela signifie que vous prenez une liste de a et renvoyer un seul a chose. Et si tu avais une liste de Bool ? Vous ne voulez pas que la fonction produise un Bool . Vous voulez un Int à retourner, quel que soit le type de l'objet dans la liste.

La solution la plus simple consisterait à modifier le type d'informations de l'utilisateur. lengthz a [a] -> Int . Cela signifie que l'argument peut être une liste de n'importe quoi ( a c'est le n'importe quoi, [] dit qu'il s'agit d'une liste) et le type de retour est un Int .

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