2013-05-06 6 views
1

Je vérifiais certains codes puis j'ai essayé d'écrire l'un d'entre eux mais je continue à obtenir une erreur d'analyse '=' mais quand je copie coller le code de la source ça marche bien donc quelle est la différence entre ceci?Quelle est la différence entre ces deux (Haskell)

quicksort2 :: (Ord a) => [a] -> [a] 
quicksort2 [] = [] 
quicksort2 (x:xs) = 
    let smallerSorted = quicksort2 [a | a <- xs, a <= x] 
     biggerSorted = quicksort2 [a | a <- xs, a > x]  
    in smallerSorted ++ [x] ++ biggerSorted 

et cela; Quicksort2 obtient une erreur d'analyse, mais pas le quicksort. Alors, où est la différence?

l'erreur -> .hs: 5: 26: Erreur d'analyse sur l'entrée '= »

+2

Où est l'erreur d'analyse? – jpaugh

+2

Copiez + collez le message d'erreur complet dans votre question s'il vous plaît. – dave4420

+0

c'est sur le plus gros – nbdip

Répondre

8

On a mélangé onglets dans l'échancrure, tandis que l'autre utilise uniquement des espaces. Cela provoque des problèmes car les espaces sont très importants dans Haskell, et votre éditeur peut être configuré avec une largeur de tabulation différente de celle de Haskell (qui utilise toujours 8). Cela peut donc sembler correct dans votre éditeur, mais pour le compilateur, l'indentation est complètement foirée.

Voici comment votre code ressemble à Haskell:

quicksort2 :: (Ord a) => [a] -> [a] 
quicksort2 [] = [] 
quicksort2 (x:xs) = 
    let smallerSorted = quicksort2 [a | a <- xs, a <= x] 
      biggerSorted = quicksort2 [a | a <- xs, a > x]  
     in smallerSorted ++ [x] ++ biggerSorted 
^^^^^^^^ 
There are tabs here on the two lines above. 

Cela donne une erreur de syntaxe, car ne sont pas correctement alignées les fixations du let -expression.

En général, évitez d'utiliser des onglets pour l'indentation dans Haskell. Configurez votre éditeur pour toujours utiliser des espaces et cela vous évitera beaucoup de maux de tête.

Questions connexes