我正在进行Nicta课程练习,在那里我遇到了一个我不理解的例子.我有两个函数,它们的类型如下:
filtering :: Applicative f => (a -> f Bool) -> List a -> f (List a)
(>) :: Ord a => a -> a -> Bool
Run Code Online (Sandbox Code Playgroud)
然后,我申请filtering到(>)和检查类型是GHCI.结果类型是:
filtering (>) :: Ord a => List a -> a -> List a
Run Code Online (Sandbox Code Playgroud)
我不明白这个结果是怎么产生的.
要理解表达式的filtering (>)含义,您应该知道在这里使用了Applicative的哪个实例.
实际上,这里使用了实例 Applicative ((->) a),它专门将函数过滤为以下类型(注意我们使用(b ->)而不是((->) a)下面的,这是相同的)
filtering :: (a -> (b -> Bool)) -> List a -> (b -> (List a))
Run Code Online (Sandbox Code Playgroud)
当应用时(>),为了统一(a -> (b -> Bool))而且(a -> (a -> Bool)),我们知道b必须等于a,所以filtering是专门的
filtering :: (a -> (a -> Bool)) -> List a -> (a -> (List a))
Run Code Online (Sandbox Code Playgroud)
所以我们filtering (>)直接得到了这种类型
filtering (>) :: (Ord a) => List a -> (a -> (List a))
Run Code Online (Sandbox Code Playgroud)
这和GHCi一样.