2015-03-19 27 views
1

我想編寫一個函數,把參數作爲這樣的元組的列表:從列表中移除元組(哈斯克爾)

remove' [ ("a", True), ("b", False), ("c", False), ("d", True) ] 

我想回到那個有假作爲他們的第二個值元組的列表,所以我想我的功能返回

[ ("b", False), ("c", False) ] 

這是我到目前爲止,但它不會加載GHCi。誰能幫我嗎?由於

remove' :: [(a,b)] -> [(a,b)] 
remove' [(a,b)] = [ c | c <- [(a,b)], c `notElem` True ] 
+1

你的函數只匹配('[(a,b])')。你可能想要更通用的東西,比如'remove'list = ...'。 – Xymostech 2015-03-19 00:51:20

回答

3

既然你要的元組的第二個元素匹配,你需要從數組選擇第二個元素,並將其與False這樣

remove' :: [(a, Bool)] -> [(a, Bool)] 
remove' xs = [c | c <- xs, snd c == False] 

比較snd功能將得到第二來自每個元組的元素,並將它們與False進行比較。只有它們匹配,它們纔會被收集在結果列表中。

由於第二元素是布爾值,你可以使用not功能的這樣

[c | c <- xs, (not . snd) c] 

我們可以表達wihtout點符號這樣

[c | c <- xs, not(snd(c))] 

注相同:在你的程序中,你有

remove' [(a,b)] = ... 

這意味着,它將僅在使用大小爲1的元組列表調用remove時執行。您可以檢查,像這樣

remove' :: [(a, Bool)] -> [(a, Bool)] 
remove' [(a, b)] = [(a, b)] 

remove' [ ("a", True), ("b", False), ("c", False), ("d", True) ] 

將打印

Non-exhaustive patterns in function remove' 

這意味着你在函數定義指定的模式沒有覆蓋所有可能的輸入。由於我們需要處理任意長度的元組列表,因此我們在xs中接受並在列表理解中使用它。

+0

xs是什麼意思?我通常會看到xs表示列表的末尾 – Chalupa 2015-03-19 00:52:51

+1

'xs'是將具有元組列表的參數。 – thefourtheye 2015-03-19 00:53:29

+0

謝謝你的解釋! – Chalupa 2015-03-19 00:54:40

0

你只需要過濾和拉姆達選擇第二項:

filter (\x -> (snd x) == False) [("a", False), ("b", True)] 

響應:

[("a",False)] 
1

我很驚訝還沒有人說

remove' = filter (not . snd)