了解如何应用Haskell函数

时间:2016-12-15 13:56:44

标签: haskell

我正在进行Nicta课程练习,在那里我遇到了一个我不明白的例子。 我有两个函数,它们的类型如下:

filtering :: Applicative f => (a -> f Bool) -> List a -> f (List a)

(>) :: Ord a => a -> a -> Bool

然后我将filtering应用于(>)并检查类型是GHCi。结果类型是:

filtering (>) :: Ord a => List a -> a -> List a

我不明白这个结果是如何产生的。

2 个答案:

答案 0 :(得分:6)

要了解表达式filtering (>)的含义,您应该知道在这里使用了哪个Applicative实例。

实际上,此处使用了the instance Applicative ((->) a),它将功能过滤专门用于以下类型(请注意,我们使用(b ->)代替((->) a),这是相同)

filtering :: (a -> (b -> Bool)) -> List a -> (b -> (List a))

应用(>)时,要统一(a -> (b -> Bool))(a -> (a -> Bool)),我们知道b必须等于a,因此filtering专门用于

filtering :: (a -> (a -> Bool)) -> List a -> (a -> (List a))

所以我们直接得到filtering (>)的类型

filtering (>) :: (Ord a) => List a -> (a -> (List a))

与GHCi的内容相同。

答案 1 :(得分:3)

编译器会尝试统一两种类型:a -> (a -> Bool)b -> f Bool。它看到lhs和rhs是函数。因此,它会尝试统一a = ba -> Bool = f Boola = b是统一的。与a -> Bool等效的(->) a Bool。因此,从(->) a Bool = f Bool获取f = (->) a。如果我们将替换f = (->) a应用于类型表达式List a -> f (List a),我们将得到:List a -> (->) a (List a)List a -> a -> List a

相当