首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >学习Haskell:如何从Haskell中的列表中删除项目

学习Haskell:如何从Haskell中的列表中删除项目
EN

Stack Overflow用户
提问于 2010-01-20 06:04:54
回答 7查看 87.9K关注 0票数 23

试着学习哈斯克尔。我正在尝试编写一个简单的函数来从列表中删除一个数字,而不使用内置的函数(我想是delete……)。为简单起见,我们假设输入参数为Integer,列表为Integer list。这是我的代码,请告诉我下面的代码有什么问题

代码语言:javascript
复制
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
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-01-20 07:05:35

其他人是对的,问题出在:运算符。不过,我想说返回列表的areTheySame函数无论如何都是错误的方法。与其切换到++运算符,该函数的更好实现应该是:

代码语言:javascript
复制
removeItem _ []                 = []
removeItem x (y:ys) | x == y    = removeItem x ys
                    | otherwise = y : removeItem x ys

如您所见,这是一个非常简单的实现。而且,与将一堆列表附加在一起相比,这样的协商对您的程序来说要少得多。它还有其他好处,比如懒惰地工作。

票数 37
EN

Stack Overflow用户

发布于 2010-01-20 06:10:28

:运算符并不做您认为它做的事情:

代码语言:javascript
复制
(:) :: a -> [a] -> [a]

它接受类型为a的项,并将其添加到类型为a的列表的开头。您将使用它连接两个类型为a的列表。为此,您需要使用++

代码语言:javascript
复制
(++) :: [a] -> [a] -> [a]

另外,如果你做一个递归函数,它需要一个结束条件。所以试试这个:

代码语言:javascript
复制
removeItem _ [] = []
removeItem x (y:ys) = areTheySame x y ++ removeItem x ys

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

票数 10
EN

Stack Overflow用户

发布于 2010-01-21 07:41:20

您也可以将其作为列表理解来执行

代码语言:javascript
复制
delete :: Eq a => a -> [a] -> [a]
delete deleted xs = [ x | x <- xs, x /= deleted ]
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2097501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档