2013-03-31 11 views
5

Utilizzando GHCi faccio la seguente:Fail in una facile manipolazione lista

prelude> let lol [] = [] 
prelude> let lol (x:xs) = (lol xs) ++ [x] 

Quando cerco di valutare

prelude> lol [1, 2, 3] 

ottengo

Exception: <interactive>:3:5-32: Non-exhaustive patterns in function lol 

credo di capire il problema (elenco con 1 elemento non corrispondente?), ma non è in grado di vedere perché non può corrispondere a x: xs come x: []

+0

'diamo lol xs = caso xs di [] -> []; (x: xs) -> lol xs ++ [x] '. –

risposta

11

definisce una funzione di tipo [a] -> [b] che produce un errore di corrispondenza modello quando viene passato un elenco non vuoto Questa definizione viene pedinato da

prelude> let lol (x:xs) = (lol xs) ++ [x] 

di tipo [a] -> [a], che provocano un malfunzionamento modello match quando il suo argomento è un elenco vuoto.

let i collegamenti non sono incrementali, una nuova rilegatura per un nome ombreggia la vecchia rilegatura.

È possibile definire una funzione con diverse clausole separando le clausole con un punto e virgola,

let lol [] = []; lol (x:xs) = lol xs ++ [x] 
5

Il secondo let affermazione "sovrascritto" il primo - nello stesso modo come se si utilizzano più let s in do -notazione.

È possibile utilizzare gli operatori di sintassi multilinea di ghci, :{ e :}:

Prelude> :{ 
Prelude| let 
Prelude| lol [] = [] 
Prelude| lol (x:xs) = (lol xs) ++ [x] 
Prelude| :} 
Prelude> lol [] 
[] 
Prelude> lol [1,2,3] 
[3,2,1]