了解如何应用Haskell函数

mil*_*edi 1 haskell

我正在进行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)

我不明白这个结果是怎么产生的.

luo*_*990 6

要理解表达式的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一样.