erro de interpretação Haskell em onde cláusula
Pergunta
O que está errado com a definição rs
na primeira, onde seção?
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)
Estou aprendendo Haskell, mas suas regras de sintaxe me confundem. A mensagem de erro é
[1 of 1] Compiling Main ( pelindrome.hs, interpreted )
pelindrome.hs:5:8: parse error on input `rs'
Solução
Seu recuo estava errado e eu acho que você só pode ter um where
lá (eu poderia ser muito bem errado. Eu não sou um cara Haskell). Houve também um argumento ausente durante a chamada para rev
(uma lista vazia):
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")
Imprime:
"helloolleh"
Vou tentar compreendê-lo agora. Enfim, divirta-se!
Edit: Faz todo o sentido para mim agora. Eu acho que é a versão correta. Para regras de recuo Haskell, leia Haskell Indentation
Outras dicas
@ litb: Você pode reescrever con no caminho
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)
que é como ++ é implementado em prelúdio. Minha versão anterior é a maneira como escrevê-lo em linguagens funcionais ou lógicos não preguiçosos cauda chamada moda (por exemplo Erlang).