从列表中删除元组 (Haskell)
removing tuples from list (Haskell)
我想编写一个函数,将元组列表作为参数,如下所示:
remove' [ ("a", True), ("b", False), ("c", False), ("d", True) ]
我想要 return 一个以 False 作为第二个值的元组列表,所以我想要我的函数 return
[ ("b", False), ("c", False) ]
这是我目前拥有的,但它不会加载到 GHCi 中。谁能帮我吗?谢谢
remove' :: [(a,b)] -> [(a,b)]
remove' [(a,b)] = [ c | c <- [(a,b)], c `notElem` True ]
由于要匹配元组的第二个元素,所以需要从元组中取出第二个元素,然后像这样与False
进行比较
remove' :: [(a, Bool)] -> [(a, Bool)]
remove' xs = [c | c <- xs, snd c == False]
snd
函数将从每个元组中获取第二个元素并将它们与 False
进行比较。只有当它们匹配时,它们才会被收集到结果列表中。
由于第二个元素是布尔值,您可以像这样使用 not
函数
[c | c <- xs, (not . snd) c]
我们可以像这样不用点符号来表达同样的意思
[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
中接受它并在列表理解中使用它。
您只需要过滤器和 select lambda 中的第二项:
filter (\x -> (snd x) == False) [("a", False), ("b", True)]
回复:
[("a",False)]
我很惊讶还没有人说
remove' = filter (not . snd)
我想编写一个函数,将元组列表作为参数,如下所示:
remove' [ ("a", True), ("b", False), ("c", False), ("d", True) ]
我想要 return 一个以 False 作为第二个值的元组列表,所以我想要我的函数 return
[ ("b", False), ("c", False) ]
这是我目前拥有的,但它不会加载到 GHCi 中。谁能帮我吗?谢谢
remove' :: [(a,b)] -> [(a,b)]
remove' [(a,b)] = [ c | c <- [(a,b)], c `notElem` True ]
由于要匹配元组的第二个元素,所以需要从元组中取出第二个元素,然后像这样与False
进行比较
remove' :: [(a, Bool)] -> [(a, Bool)]
remove' xs = [c | c <- xs, snd c == False]
snd
函数将从每个元组中获取第二个元素并将它们与 False
进行比较。只有当它们匹配时,它们才会被收集到结果列表中。
由于第二个元素是布尔值,您可以像这样使用 not
函数
[c | c <- xs, (not . snd) c]
我们可以像这样不用点符号来表达同样的意思
[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
中接受它并在列表理解中使用它。
您只需要过滤器和 select lambda 中的第二项:
filter (\x -> (snd x) == False) [("a", False), ("b", True)]
回复:
[("a",False)]
我很惊讶还没有人说
remove' = filter (not . snd)