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'
Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top