2009-11-08 4 views
1

Je suis en train d'écrire une fonction ajouter Haskell ... Voici ce que j'ai:Haskell Noob question: Quel est le problème avec ma fonction d'ajout?

myappend :: [a] -> [a] -> [a] 
myappend [] x = x 
myappend [x:xs] y = x : myappend xs y 

Mais il me donne une erreur: Survient vérifier: ne peut pas construire le type infini: a = [a] Quand généraliser le (s) type (s) pour myappend

Donc, évidemment, il y a quelque chose qui ne va pas mais je ne peux pas le voir ... Qu'est-ce qui ne va pas avec ma fonction d'ajout?

Répondre

13

Les constructeurs du type [a] sont:

Donc, vous devez utiliser:

myappend :: [a] -> [a] -> [a] 
myappend [] x = x 
myappend (x:xs) y = x : myappend xs y 

La syntaxe

[x:xs] 

est à peu près équivalente à

[(x:xs)] 

qui correspond à une liste avec un élément, une liste non vide, et a le type

[(x:xs)] :: [[a]] 

Je recommande la lecture this page si vous voulez comprendre le concept correspondant constructeur et modèle.

+0

Ahah! Crochets stupides. Je le vois maintenant! À quoi je pensais!? Merci! –

1

Il devrait y avoir aucun [] entre parenthèses dans myappend (x:xs) y = x : (myappend xs y)

[1,2,3] et 1:2:3:[] sont différentes façons de définir la même liste. Pour que [x:xs] corresponde à une liste d'éléments composée d'une autre liste.

4

Le motif dans le second cas de la fonction doit être juste (x:xs), pas [x:xs]:

myappend (x:xs) y = x : myappend xs y 

x:xs correspond à un élément suivi d'une liste, la parenthèse sont juste là pour faire ce que syntaxiquement clair appartient à ce modèle. [x:xs] correspond à une liste contenant x:xs.

Questions connexes