删除符合标准的列表中的第一个值

时间:2015-02-23 19:01:24

标签: haskell recursion tail-recursion

我正试图解决这个问题。该函数有两个参数。第一个是返回布尔值的函数,第二个是数字列表。该函数应该删除第二个参数中的第一个值,该值在使用第一个参数运行时返回true。 还有第二个函数,它执行相同的操作,除了它删除满足它的最后一个值,而不是第一个。 我相当肯定我有逻辑,因为我用另一种语言测试它并且它工作,我唯一的问题是将其转换为Haskell语法。这就是我所拥有的:

removeFirst :: (t -> Bool) -> [t] -> [t]
removeFirst p xs = []
removeFirst p xs
        |   p y = ys 
        |   otherwise = y:removeFirst p ys
        where
            y:ys = xs

removeLast :: (t -> Bool) -> [t] -> [t]
removeLast p xs = []
removeLast p xs = reverse ( removeFirst p ( reverse xs ) )

我跑了:

removeFirst even [1..10]

但不是按预期得到[1,3,4,5,6,7,8,9,10],而是得到[]。 我做错了什么?

2 个答案:

答案 0 :(得分:4)

removeFirst p xs = []

这总是返回空列表,它匹配所有参数。我想你的意思是这个。

removeFirst _ [] = []

答案 1 :(得分:2)

你的第一个等式,

removeFirst p xs = []

说“无论我的论点是什么,只需返回[]”,其余代码将被忽略。

你可能意味着

removeFirst p [] = []

说“当列表已经为空时,返回空列表。”