2013-03-31 28 views
5

使用GHCI我做了以下內容:失敗中容易列表操作

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

當我嘗試評估

prelude> lol [1, 2, 3] 

我得到

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

我想我明白這個問題(列表中有1個元素不匹配?),但看不出爲什麼他不能匹配x:xs as x:[]

+0

'讓洛爾XS =的[]情況下XS - > []; (x:xs) - > lol xs ++ [x]'。 –

回答

11
prelude> let lol [] = [] 

定義了一個類型爲[a] -> [b]的函數,它在傳遞非空列表時將產生模式匹配失敗。該定義然後通過

prelude> let lol (x:xs) = (lol xs) ++ [x] 
[a] -> [a]類型的

,這將導致一個模式匹配失敗時它的參數是一個空列表陰影。

let綁定不是增量式的,名稱的新綁定會隱藏舊綁定。

您可以通過用分號分隔的子句定義幾個條款的功能,

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

第二let聲明「改寫」第一 - 因爲如果你使用多個let S IN以同樣的方式do -notation。

可以使用ghci中的多行的語法運營商,:{:}和:

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