Haskell: ошибка синтаксического анализа с 'where' и защитником - PullRequest
3 голосов
/ 22 августа 2009

Итак, я только начинаю учить себя Haskell из книги Real World Haskell , и в ходе выполнения одного из упражнений я написал следующий код:

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

Когда я загрузил его в GHCi 6.6, я получил следующую ошибку:

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

Я практически уверен, что ошибка связана с взаимодействием предложения where и последующей защиты; комментирование защиты исключает его, равно как и замена предложения where эквивалентным предложением let. Я также почти уверен, что, должно быть, каким-то образом исказил отступ, но не могу разобраться, как.

Заранее благодарим за любые советы.

Ответы [ 2 ]

11 голосов
/ 22 августа 2009

where нельзя разместить между охранниками. Из пункта 4.4.3.1 Привязки функций в отчете Haskell.

9 голосов
/ 22 августа 2009

Попробуйте:

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