【发布时间】:2021-05-24 08:35:00
【问题描述】:
如何从元组列表中删除仅匹配元组第一个值的元素。
delete (2, _ ) [(2, True), (3, False)]
【问题讨论】:
-
你尝试了什么,什么不起作用?
-
提示:检查模块
Data.List。有一个功能可以做到这一点
如何从元组列表中删除仅匹配元组第一个值的元素。
delete (2, _ ) [(2, True), (3, False)]
【问题讨论】:
Data.List。有一个功能可以做到这一点
在这种情况下,签名看起来像:
delete1 :: <b>Eq a</b> => <b>a</b> -> [(<b>a</b>, b)] -> [(a, b)]
我们可以使用递归在 2 元组中查找匹配项,因此函数可以如下所示:
delete1 :: Eq a => a -> [(a, b)] -> [(a, b)]
delete1 y = go
where go [] = … -- (1)
go (x:xs)
| y == x = … -- (2)
| otherwise = … -- (3)
填写…s 留作练习。在第一种情况下 ((1)) 列表已用尽,因此我们可以返回一个空列表。
对于第二种情况 ((2)),找到了匹配项,因此在这种情况下,我们在列表的尾部进行递归。
在最后一种情况下,项目x 确实不与y 匹配,所以在这种情况下我们产生项目并递归。
然而我们不必自己实现递归,我们可以filter :: (a -> Bool) -> [a] -> [a]列表,从而实现如下函数:
delete1 :: Eq a => a -> [(a, b)] -> [(a, b)]
delete1 y = filter func
where func = …
这里 … 部分需要返回 True 以防我们想要保留该项目,并返回 False 以防我们想要过滤掉该值。
【讨论】: