1

大家好,我对 Haskell 比较陌生,并且仍在学习,为什么这不起作用?

filterFirst :: (a -> Bool) -> [a] -> [a]
filterFirst p xs = delete (not . p) (filter (not . p)  xs)

当我在终端中收到以下错误消息时:

ERROR "FirstLiterate.lhs":58 - Type error in application
*** Expression     : delete (not . p) (filter (not . p) xs)
*** Term           : not . p
*** Type           : a -> Bool
*** Does not match : a
*** Because        : unification would give infinite type

所以我知道该类型与我定义中的类型不匹配。我怎样才能改变它,这样我就不必改变(a -> Bool)?

4

2 回答 2

6

的第一个参数delete应该是列表的一个元素(在本例中是 type 的值a),而不是 type 的函数a -> Bool

你得到的类型错误告诉你not . p有 type a -> Bool,但是delete函数需要一个 type 的值a

于 2013-09-27T14:28:35.863 回答
0

您可以使用deleteBy :: (a -> a -> Bool) -> a -> [a] -> [a].

于 2013-09-27T14:56:13.803 回答