我正试图解决这个问题。该函数有两个参数。第一个是返回布尔值的函数,第二个是数字列表。该函数应该删除第二个参数中的第一个值,该值在使用第一个参数运行时返回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],而是得到[]。 我做错了什么?
答案 0 :(得分:4)
removeFirst p xs = []
这总是返回空列表,它匹配所有参数。我想你的意思是这个。
removeFirst _ [] = []
答案 1 :(得分:2)
你的第一个等式,
removeFirst p xs = []
说“无论我的论点是什么,只需返回[]”,其余代码将被忽略。
你可能意味着
removeFirst p [] = []
说“当列表已经为空时,返回空列表。”