Что не так с определением rs в первом разделе where?
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'





Ваш отступ был неправильным, и я думаю, что у вас может быть только один where (я могу очень ошибаться. Я не парень haskell). Также отсутствовал аргумент для вызова 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
Не странно: тот же синтаксический уровень -> тот же отступ
вы можете использовать фигурные скобки, чтобы "нарушить" это правило
@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)
вот как ++ реализован в prelude. Моя предыдущая версия - это способ написания этого на неленивых функциональных или логических языках в стиле хвостовых вызовов (например, Erlang).
Я думал, что (++) определяется как (++) = flip $ foldr (:) - так я бы все равно написал.
Вы правы, rs должен начинаться в том же столбце, что и con в предыдущей строке. Это странное правило.