这个Haskell有什么问题? “输入上的解析错误'='”

时间:2011-05-08 23:21:54

标签: haskell syntax indentation

我一直收到此错误消息,我不明白为什么:

src\Parsing.hs:21:18: parse error on input `='

它来自这条线:

tokens  = map strip $ splitWhen (== delimiter) line

我的代码:

tokenize :: String -> HashMap String String
tokenize line = 
   let (delimiter, fieldOrder) = delimiterAndFieldOrderFor line
           tokens  = map strip $ splitWhen (== delimiter) line
   in Map.fromList $  zip fieldOrder tokens

delimiterAndFieldOrderFor :: String -> (Char, [String])
delimiterAndFieldOrderFor line    
       | isInfixOf "," line = (',', ["LastName", "FirstName", "Gender", "FavoriteColor", "BirthDate"])    
       | isInfixOf "|" line = ('|', ["LastName", "FirstName", "Ignored", "Gender", "FavoriteColor", "BirthDate"])    
       | otherwise          = (' ', ["LastName", "FirstName", "Ignored", "Gender", "BirthDate", "FavoriteColor"])

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

压痕。

在第4行,tokens应缩进到与开始(delim...的parens相同的深度。 E.g。

tokenize line = 
   let (delimiter, fieldOrder) = delimiterAndFieldOrderFor line
       tokens  = map strip $ splitWhen (== delimiter) line
   in Map.fromList $  zip fieldOrder tokens

您也可以考虑使用where子句:

tokenize line = Map.fromList $ zip f tokens
   where
       (sep, f) = delimiterAndFieldOrderFor line
       tokens   = map strip $ splitWhen (== sep) line

作为一种风格,那些非常长的变量名称有点混淆,IMO。

答案 1 :(得分:1)

此代码中有额外的缩进:

let (delimiter, fieldOrder) = delimiterAndFieldOrderFor line
       tokens  = map strip $ splitWhen (== delimiter) line
in Map.fromList $  zip fieldOrder tokens

这会导致编译器将该行视为其上方行上的表达式的延续。它应该是

let (delimiter, fieldOrder) = delimiterAndFieldOrderFor line
    tokens  = map strip $ splitWhen (== delimiter) line
in Map.fromList $  zip fieldOrder tokens