List 从列表中删除元组(Haskell)

List 从列表中删除元组(Haskell),list,haskell,tuples,list-comprehension,List,Haskell,Tuples,List Comprehension,我想编写一个函数,将元组列表作为参数,如下所示: remove' [ ("a", True), ("b", False), ("c", False), ("d", True) ] 我想返回一个元组列表,这些元组的第二个值是False,所以我想让我的函数返回 [ ("b", False), ("c", False) ] 这是我到目前为止所拥有的,但它不会加载到GHCi中。有人能帮我吗?谢谢 remove' :: [(a,b)] -> [(a,b)] remove' [(a,b)] =

我想编写一个函数,将元组列表作为参数,如下所示:

remove'  [ ("a", True), ("b", False), ("c", False), ("d", True) ]
我想返回一个元组列表,这些元组的第二个值是False,所以我想让我的函数返回

[ ("b", False), ("c", False) ]
这是我到目前为止所拥有的,但它不会加载到GHCi中。有人能帮我吗?谢谢

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

删除“[(a,b)]=[c | c因为您想要匹配元组的第二个元素,所以需要从元组中选取第二个元素,并将其与
False
进行如下比较

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

remove' [ ("a", True), ("b", False), ("c", False), ("d", True) ]
我们可以用这样的点符号来表示相同的内容

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

remove' [ ("a", True), ("b", False), ("c", False), ("d", True) ]
这意味着,只有当使用大小为
1
的元组列表调用remove时,才会执行它

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

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

函数remove中的非穷举模式'

这意味着您在函数定义中指定的模式没有覆盖所有可能的输入。因为我们需要处理任意长度的元组列表,我们在
xs
中接受它,并在列表理解中使用它。

因为您想匹配元组的第二个元素,所以需要从元组中选择第二个元素并将其与下面的
False
进行比较

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

remove' [ ("a", True), ("b", False), ("c", False), ("d", True) ]
我们可以用这样的点符号来表示相同的内容

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

remove' [ ("a", True), ("b", False), ("c", False), ("d", True) ]
这意味着,只有当使用大小为
1
的元组列表调用remove时,才会执行它

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

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

函数remove中的非穷举模式'

这意味着您在函数定义中指定的模式没有覆盖所有可能的输入。因为我们需要处理任意长度的元组列表,所以我们在
xs
中接受它,并在列表理解中使用它。

您只需筛选并选择lambda中的第二项:

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

[("a",False)]

您只需筛选并选择lambda中的第二项:

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

[("a",False)]

我很惊讶还没有人说

remove' = filter (not . snd)

我很惊讶还没有人说

remove' = filter (not . snd)

您的函数仅与其中包含一个元组的列表(
[(a,b])
)匹配。您可能需要更一般的内容,如
remove'list=…
。您的函数仅与其中包含一个元组的列表匹配(
[(a,b])
)。你可能想要更一般的东西,比如
remove'list=…
。xs是什么意思?我通常看到xs表示列表的结尾
xs
是包含元组列表的参数。谢谢你的解释!xs是什么意思?我通常看到xs表示列表的结尾
xs
是ch将有元组列表。感谢您的精彩解释!