Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 在Haskell中删除或添加项目到列表_List_Haskell - Fatal编程技术网

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代码不同的是,你在列表末尾添加元素。(当他们将列表视为一个集合时,这并不重要)谢谢,伙计们!递归优化看起来不错,在我的例子中,项目的位置无关紧要,所以在列表的末尾添加就可以了。