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'
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top