2013-03-31 13 views
5

Korzystanie GHCi I wykonaj następujące czynności:Fail w łatwy lista manipulacji

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

Kiedy próbuję oceniać

prelude> lol [1, 2, 3] 

uzyskać

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

Chyba rozumiem problem (lista z 1 elementem niezgodnym?), ale nie widzi powodu, dla którego nie może dopasować x: xs jako x: []

+0

'niech lol xs = case xs z [] -> []; (x: xs) -> lol xs ++ [x] '. –

Odpowiedz

11
prelude> let lol [] = [] 

definiuje funkcję typu [a] -> [b], która spowoduje niepowodzenie dopasowania do wzorca, gdy zostanie przekazana niepusta lista. Definicja ta jest następnie zasłonięta przez

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

typu [a] -> [a], co spowoduje awarię wzór meczów, gdy jego argument jest pusta lista.

let powiązania nie są przyrostowe, nowe powiązanie nazwy cienia starego powiązania.

Można zdefiniować funkcję z kilku klauzul oddzielając klauzul średnikiem,

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

Drugi let stwierdzenie „nadpisałeś” pierwszy - w ten sam sposób, jeśli stosuje się wiele let sw do -notacja.

Można używać operatorów składniowe kilka linii ghci, w :{ i :}:

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