学习Haskell:如何从Haskell中的List中删除项目

BM.*_*BM. 21 haskell list

试图学习Haskell.我正在尝试编写一个简单的函数来从列表中删除一个数字而不使用内置函数(删除...我认为).为简单起见,我们假设输入参数是一个Integer,列表是一个Integer列表.这是我的代码,请告诉我以下代码有什么问题

areTheySame :: Int -> Int-> [Int]

areTheySame x y | x == y = []
                | otherwise = [y]

removeItem :: Int -> [Int] -> [Int]

removeItem x (y:ys) = areTheySame x y : removeItem x ys
Run Code Online (Sandbox Code Playgroud)

Chu*_*uck 31

其他人是正确的,问题是:运营商.不过,我会说你的areTheySame函数返回列表是错误的方法.而不是切换到++运算符,该函数的更好实现将是:

removeItem _ []                 = []
removeItem x (y:ys) | x == y    = removeItem x ys
                    | otherwise = y : removeItem x ys
Run Code Online (Sandbox Code Playgroud)

如您所见,这是一个非常简单的实现.此外,像这样的消费对你的程序来说要比将一堆列表附加在一起要少得多.它还有其他好处,比如懒惰地工作.


Chr*_*utz 10

:运营商没有做什么你认为它的作用:

(:) :: a -> [a] -> [a]
Run Code Online (Sandbox Code Playgroud)

它接受一个类型的项目a并将其添加到类型列表的开头a.您正在使用它来加入两个类型列表a.为此,您需要使用++:

(++) :: [a] -> [a] -> [a]
Run Code Online (Sandbox Code Playgroud)

此外,如果您创建递归函数,它需要一个结束条件.试试这个:

removeItem _ [] = []
removeItem x (y:ys) = areTheySame x y ++ removeItem x ys
Run Code Online (Sandbox Code Playgroud)

这样,当你到达列表的末尾时,该函数将停止递归.


小智 9

您也可以将此作为列表理解

delete :: Eq a => a -> [a] -> [a]
delete deleted xs = [ x | x <- xs, x /= deleted ]
Run Code Online (Sandbox Code Playgroud)


Jua*_*nto 5

我只用一行代码写了一个函数:

remove element list = filter (\e -> e/=element) list
Run Code Online (Sandbox Code Playgroud)

例如:

remove 5 [1..10]
Run Code Online (Sandbox Code Playgroud)

[1,2,3,4,6,7,8,9,10]

remove 'b' ['a'..'f']
Run Code Online (Sandbox Code Playgroud)

“acdef”

  • 你不需要这里的 lambda `filter (/=element) list` (3认同)