Errore del parser Haskell nella clausola where
Domanda
Cosa c'è di sbagliato nella definizione rs
nella prima sezione dove
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)
Sto solo imparando Haskell ma le sue regole di sintassi mi confondono. Il messaggio di errore è
[1 of 1] Compiling Main ( pelindrome.hs, interpreted )
pelindrome.hs:5:8: parse error on input `rs'
Soluzione
Il tuo rientro era sbagliato e penso che tu possa avere solo un dove
(potrei sbagliarmi molto bene. Non sono un ragazzo haskell). Mancava anche un argomento per la chiamata a rev
(un elenco vuoto):
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")
Stampa:
"helloolleh"
Ora proverò a capirlo. Comunque, divertiti!
Modifica: ora ha perfettamente senso per me. Penso che sia la versione giusta. Per le regole di rientro di Haskell, leggi Haskell Indentation
Altri suggerimenti
@litb: puoi riscrivere con in
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)
che è come ++ viene implementato in preludio. La mia versione precedente è il modo in cui scriverlo in linguaggi funzionali o logici non pigri in modo da chiamate di coda (ad es. Erlang).