2013-02-28 2 views
0

Voici le code qui, à mon avis, ne devrait pas causer de problème, mais pour une raison quelconque?Haskell Parsec problème étrange avec plusieurs occurrences d'expression

program = expr8 
     <|> seqOfStmt 

    seqOfStmt = 
     do list <- (sepBy1 expr8 whiteSpace) 
      return $ if length list == 1 then head list else Seq list 

Je reçois 3 erreurs par rapport au fait que 'list' n'est pas dans la portée? Il est probablement évident que ce qui ne va pas, mais je ne peux pas comprendre pourquoi

S'il y a des alternatives à cela, je voudrais vraiment les entendre!

Merci à l'avance, Seán

+2

Votre indentation a l'air cassée (les lignes suivantes 'program' et' seqOfStmt' devraient être indentées plus loin que la définition.A part cela, il est très difficile de tester votre programme sans connaître vos autres définitions (par exemple où 'expr8' , 'whiteSpace' et' Seq' viennent?) –

+0

Le problème est le type de la valeur que vous retournez: 'si longueur liste == 1 puis liste de tête sinon Seq liste' - disons que la liste est [a], alors vous retournez a dans la clause then et quelque chose de très différent dans la clause else (sauf si Seq est un constructeur de type '[a] -> a', ce qui n'est pas facilement possible) – Ingo

Répondre

3

Votre dernière ligne utilise un caractère de tabulation pour l'indentation, tandis que les autres lignes utilisent des espaces uniquement.

Vous avez défini des onglets sur quatre espaces dans votre éditeur, mais ghc utilise des taquets de tabulation de huit caractères (comme le font les terminaux).

Par conséquent votre ligne return est analysée comme une continuation de la ligne précédente, et list n'est pas encore dans la portée.

Un moyen facile de résoudre ce problème est de ne pas utiliser d'onglets: utilisez uniquement des espaces.


Une fois que vous avez résolu que, votre prochaine erreur sera probablement une erreur de type: head list et Seq list ont différents types (sauf peut-être vous avez redéfini head pour une raison quelconque). Il n'est pas clair pourquoi vous voulez traiter la liste différemment si elle ne contient qu'un seul élément.

+0

qui a fonctionné, mais j'ai maintenant une erreur avec retour, des idées? Clairement, je ne suis pas compétent avec Haskell – Sean

+1

Je ne suis pas psychique! Ce serait beaucoup plus facile pour moi et tout le monde si vous avez posté votre code exactement comme il est maintenant, et l'erreur complète message. Idéalement, postez une nouvelle question. – dave4420

+2

Allons @ dave4420, vous pouvez utiliser le "Connexion à distance et comprendre l'erreur" bouton tout le monde avec plus de 10k de réputation est fourni par SO. – Ingo