List 在Haskell中删除或添加项目到列表
我必须设计一个函数List 在Haskell中删除或添加项目到列表,list,haskell,List,Haskell,我必须设计一个函数removeorad::a->[a]->[a]。我直截了当的解决方案: removeOrAdd :: Eq a => a -> [a] -> [a] removeOrAdd x xs | x `elem` xs = [x' | x' <- xs, x' /= x] | otherwise = x : xs removeorad::Eq a=>a->[a]->[a] 移除或添加x xs | x`elem`xs=[x'
removeorad::a->[a]->[a]
。我直截了当的解决方案:
removeOrAdd :: Eq a => a -> [a] -> [a]
removeOrAdd x xs | x `elem` xs = [x' | x' <- xs, x' /= x]
| otherwise = x : xs
removeorad::Eq a=>a->[a]->[a]
移除或添加x xs | x`elem`xs=[x'| x'
Haskell中是否有任何函数已经完成了它
据我所知,没有,而且搜索不会立即列出这样的函数。我认为这很奇怪,因为通常情况下,一个人的目标是添加或删除,但不是根据条件同时添加或删除
我们可以改进上述函数,使其更为懒惰(这样它就可以在x
从未出现过的无限列表上工作),也可以提高效率,因为我们不会在列表上迭代两次。我们可以为此使用显式递归:
removeOrAdd :: Eq a => a -> [a] -> [a]
removeOrAdd x = go
where go [] = [x]
go (y:ys) | x == y = ys
| otherwise = y : go ys
因此,我们在这里迭代列表,我们不断迭代,直到找到一个元素y
,它等于x
。如果是这种情况,我们返回ys
,我们就完成了,因为我们删除了该项。如果不是,我们通过递归到达列表的末尾,我们知道x
不是列表的一部分,因此我们重新开始n[x]
添加该元素。因此,我们将元素添加到列表的末尾
如果列表已排序,我们可以将其插入正确的位置:
removeOrAdd :: Ord a => a -> [a] -> [a]
removeOrAdd x = go
where go [] = [x]
go (y:ys) | x == y = ys
| y > x = x : y : ys
| otherwise = y : go ys
removeorad::Ord a=>a->[a]->[a]
移除或添加x=go
何去何从[]=[x]
go(y:ys)| x==y=ys
|y>x=x:y:ys
|否则=y:go ys
因此,我们在这里保持项目的正确顺序。我不知道有任何函数可以做到这一点,我也不确定为什么需要存在。向列表中添加一个元素,然后删除一个或多个不同的操作,正如您所证明的,如果您想要这样做,自己做一点也不困难。(注意,第一种情况的结果可以简化为过滤器(/=x)xs
)如果x
多次出现会怎样?您想删除所有这些项目,还是只删除第一个/最后一个项目?嗯……我不希望有超过一个x。所以让我们将其视为一个集合。让我更新问题。@mkUltra在这种情况下,您可能希望在每次通话时都查看列表。关于列表理解,有:-)@Bergi我明白你关于nub
的观点,我想保留列表结构,但每次都不使用nub
它,因为它是持久性记录的一部分,所以在受信任的Perimetery中,你可能想强调与OPs代码不同的是,你在列表末尾添加元素。(当他们将列表视为一个集合时,这并不重要)谢谢,伙计们!递归优化看起来不错,在我的例子中,项目的位置无关紧要,所以在列表的末尾添加就可以了。