См. Этот новый блог (16 января 2019 г.), в котором объясняется процесс while:
Кроме того, обратитесь к справочная документация:
Ваше добавление отступа было неправильным, и я думаю, что у Вас может только быть тот 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: можно переписать довод "против" способом
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).