2012-10-04 7 views
2

J'essaye de faire une fonction qui cherchera 3 nombres identiques et adjacents donnés une liste, pour un solveur que j'essaye de mettre en application. Ensuite, s'il y a 3 nombres identiques et adjacents, les 1er et 3e chiffres identiques seront marqués à '0' et la valeur moyenne sera négative.Haskell récursion utilisant un accumulateur

Je me demande pourquoi cela me donne une erreur .:

change xs = chnge xs [] 
    where 
    chnge xs acc 
     | length xs <= 2 = [acc] 
     | (head xs == xs !! 1) && (head xs == xs !! 2) = [0, (xs !! 1)*(-1), 0] ++ tail xs 
     | otherwise = chnge (tail xs) (acC++ head xs) 
+0

Il s'agit simplement d'une erreur d'analyse car votre clause where (ainsi que son contenu) doit être indentée d'au moins un espace par rapport à la clause définissant 'change'. En règle générale, vous devriez inclure dans votre question le message d'erreur que GHC vous donne. – macron

+0

Désolé, c'était mon erreur. J'ai simplement oublié d'indenter le reste du code. Je l'ai arrangé pour correspondre à ce qu'il est vraiment. – user1670032

+1

L'erreur d'analyse est due à la mise en forme de stackoverflow, pas à la source d'origine. –

Répondre

8

Depuis acc une liste, nous ne voulons pas revenir [acc] dans la première garde de chnge, mais juste acc; De même, dans la ligne otherwise vous ne voulez pas acC++ head xs ce qui signifierait que xs est une liste de listes - de quelle autre manière son premier membre pourrait-il être annexable? Plutôt acC++ [head xs] Alors peut-être:

change xs = chnge xs [] where 
    chnge xs acc 
     | length xs <= 2 = acc 
     | (head xs == xs !! 1) && (head xs == xs !! 2) = [0, (xs !! 1)*(-1), 0] ++ tail xs 
     | otherwise = chnge (tail xs) (acC++ [head xs]) 

Cela semble un peu loin, mais le vrai problème est le manque de « pattern matching » et l'utilisation dangereuse de head, tail et !!. Essayez quelque chose de plus comme ça, peut-être? (Il n'utilise un accumulateur bien):

change []  = [] 
change [x] = [x] 
change [x,y] = [x,y] 
change (x:y:z:ws) | x == y && y == z = 0 : (-y) : 0 : change ws 
change (x:xs) = x : change xs 

-- *Main> change [12,12,66,66,66,44,44,99,99,99,76,1] 
-- [12,12,0,-66,0,44,44,0,-99,0,76,1] 

Le cas de trois dans une rangée peut être considéré comme un modèle, pour que nous fassions un cas particulier quand ils sont égaux.

Questions connexes