Ошибка синтаксического анализатора Haskell в предложении where - PullRequest
5 голосов
/ 05 января 2009

Что не так с определением rs в первом разделе где?

palindrome :: [a] -> [a]

palindrome xs = con xs rs
    where con a b = rev (rev a []) b
        rs = rev xs                        -- here
        where rev [] rs = rs
            rev (x:xs) rs = rev xs (x:rs)

Я только изучаю Haskell, но его синтаксические правила меня смущают. Сообщение об ошибке

[1 of 1] Compiling Main             ( pelindrome.hs, interpreted )

pelindrome.hs:5:8: parse error on input `rs'

Ответы [ 2 ]

13 голосов
/ 05 января 2009

Ваш отступ был неверным, и я думаю, что у вас там может быть только один where (я могу быть совершенно не прав. Я не парень из Хаскелла). Также отсутствовал аргумент для вызова rev (пустой список):

palindrome :: [a] -> [a]
palindrome xs = con xs rs
    where con a b = rev (rev a []) b
          rs = rev xs []                       -- here
          rev [] rs = rs
          rev (x:xs) rs = rev xs (x:rs)

main = print (palindrome "hello")

Распечатывает:

"helloolleh"

Я попытаюсь понять это сейчас. В любом случае, получайте удовольствие!

Редактировать: теперь имеет смысл для меня. Я думаю, что это правильная версия. Для правил отступа Haskell читайте Отступ Haskell

0 голосов
/ 06 января 2009

@ litb: Вы можете переписать con таким образом

palindrome :: [a] -> [a]
palindrome xs = con xs rs
    where con [] b = b
          con (x:xs) b = x:con xs b
          rs = rev xs []                       -- here
          rev [] rs = rs
          rev (x:xs) rs = rev xs (x:rs)

, как ++ реализовано в прелюдии. Моя предыдущая версия состоит в том, как написать ее на не ленивых функциональных или логических языках способом хвостового вызова (например, Erlang).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...