Что не так с этим Haskell?"Ошибка разбора на входе '='" - PullRequest
2 голосов
/ 09 мая 2011

Я получаю это сообщение об ошибке и не понимаю, почему:

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 ]

4 голосов
/ 09 мая 2011

Отступ.

В строке 4 tokens должен иметь отступ на ту же глубину, что и начинающиеся символы (delim...).Например,

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 голос
/ 09 мая 2011

У вас есть дополнительный отступ в этом коде:

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
...