Ваш отступ был неверным, и я думаю, что у вас там может быть только один 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