试着学习哈斯克尔。我正在尝试编写一个简单的函数来从列表中删除一个数字,而不使用内置的函数(我想是delete……)。为简单起见,我们假设输入参数为Integer,列表为Integer list。这是我的代码,请告诉我下面的代码有什么问题
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
发布于 2010-01-20 07:05:35
其他人是对的,问题出在:
运算符。不过,我想说返回列表的areTheySame
函数无论如何都是错误的方法。与其切换到++
运算符,该函数的更好实现应该是:
removeItem _ [] = []
removeItem x (y:ys) | x == y = removeItem x ys
| otherwise = y : removeItem x ys
如您所见,这是一个非常简单的实现。而且,与将一堆列表附加在一起相比,这样的协商对您的程序来说要少得多。它还有其他好处,比如懒惰地工作。
发布于 2010-01-20 06:10:28
:
运算符并不做您认为它做的事情:
(:) :: a -> [a] -> [a]
它接受类型为a
的项,并将其添加到类型为a
的列表的开头。您将使用它连接两个类型为a
的列表。为此,您需要使用++
(++) :: [a] -> [a] -> [a]
另外,如果你做一个递归函数,它需要一个结束条件。所以试试这个:
removeItem _ [] = []
removeItem x (y:ys) = areTheySame x y ++ removeItem x ys
这样,当您到达列表的末尾时,该函数将停止递归。
发布于 2010-01-21 07:41:20
您也可以将其作为列表理解来执行
delete :: Eq a => a -> [a] -> [a]
delete deleted xs = [ x | x <- xs, x /= deleted ]
https://stackoverflow.com/questions/2097501
复制相似问题