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
List 如何使用Prelude从haskell中的列表中删除每一个值?_List_Haskell - Fatal编程技术网

List 如何使用Prelude从haskell中的列表中删除每一个值?

List 如何使用Prelude从haskell中的列表中删除每一个值?,list,haskell,List,Haskell,我想从列表中删除某个值的每一次出现。我编写了一个函数来实现这一点: removeall val [] = [] removeall val list = if (head list) == val then removeall val (tail list) else (head list):(removeall val (tail list)) 但出于优雅和可读性的考虑,如果可能的话,我想使用Prelude。

我想从列表中删除某个值的每一次出现。我编写了一个函数来实现这一点:

removeall val [] = []
removeall val list = if (head list) == val
                     then removeall val (tail list)
                     else (head list):(removeall val (tail list))

但出于优雅和可读性的考虑,如果可能的话,我想使用Prelude。

以下作品也适用

removeall val list = filter (/= val) list
removeall val list = [ x | x <- list, x /= val ]

removeall val list=[x | x这只是对您的重写,它删除了head和tail函数调用

removeall val [] = []
removeall val (x:xs) = if (x == val) 
                         then removeall val xs 
                         else x:removeall val xs
就我个人而言,我更喜欢

removeall = filter . (/=)

其他人给出了一个,但初学者可能很难快速理解。

或者:removeall val=filter(/=val)
filter(/=)
版本确实让我停下来想了想,但我认为Peter的
removeall val=filter(/=val)稍微有点意义
非常清楚。第二个解决方案(以及一般的Haskell)最困难的地方是标准库非常庞大,因此初学者不知道所有的原语(如map、mapAccumL、filter、foldl、zip等)@Peter,这不是我的建议,而是Edward Kmett的建议。我喜欢第二个解决方案,因为它简洁明了,但如果我是初学者,我会按照第一个解决方案的思路去做。是的,我同意,标准库是巨大的,但一旦你了解了其中的大部分内容,你就可以开始了:)
removeall = filter . (/=)