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 . (/=)