我正在进行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
我不明白这个结果是如何产生的。
答案 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 = b
和a -> Bool = f Bool
。 a = 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