我一直收到此错误消息,我不明白为什么:
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"])
感谢您的帮助!
答案 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