2009-08-22 11 views
3

Donc, je commence tout juste à m'enseigner Haskell hors du livre Real World Haskell, et au cours de faire l'un des exercices, j'ai écrit ce qui suit Code:Haskell: erreur d'analyse avec 'où' et un gardien

step acc ch | isDigit ch = if res < acc 
           then error "asInt_fold: \ 
             \result overflowed" 
           else res 
         where res = 10 * acc + (digitToInt ch) 
      | otherwise = error ("asInt_fold: \ 
            \not a digit " ++ (show ch)) 

Quand je chargé dans GHCi 6.6, je suis l'erreur suivante:

IntParse.hs:12:12: parse error on input `|' 
Failed, modules loaded: none. 

Je suis pratiquement certain que l'erreur est due à l'interaction de la clause "where" et la garde subséquente; commenter le garde l'élimine, tout comme remplacer la clause "where" par une clause "let" équivalente. Je suis également assez sûr que je dois avoir déchiré l'indentation d'une manière ou d'une autre, mais je ne sais pas comment.

Merci d'avance pour tout conseils.

Répondre

9

Essayez:

step acc ch 
    | isDigit ch = if res < acc then error "asInt_fold: result overflowed" else res 
    | otherwise = error ("asInt_fold: not a digit " ++ (show ch)) 
    where res = 10 * acc + (digitToInt ch)