混淆应用( - >)

时间:2016-02-14 05:14:30

标签: haskell

鉴于Applicative (->)实现为:

instance Applicative ((->) a) where
    pure = const
    (<*>) f g x = f x (g x)

我很困惑以下是如何工作的:

pure (+) <*> Just 3

我的理解是:

f = pure (+)
g = Just 3

基于这种理解,<*>将成为:

-- f x (g x)
(pure (+)) x ((Just 3) x)

但是这不起作用,因为(Just 3)没有参数。所以我显然一定不知道什么,虽然我不确定那是什么。

我对这是怎么发生感到困惑:

Prelude> :t pure (+) <*> Just 3
pure (+) <*> Just 3 :: Num a => Maybe (a -> a)

请解释一下这是如何运作的。根据我对事物的理解,手动执行这些步骤,我无法达到与ghci相同的结果。

1 个答案:

答案 0 :(得分:6)

由于<*>的右侧参数为Just 3,因此使用的Applicative实例必须是Maybe的实例,而不是函数。因此,左侧必须是一个也许,因此pure (+) == Just (+)。现在您可以看到<*>如何组合这些:它展开两个Just构造函数,应用函数,并将结果放回Just:这与{{1}相同},或Just ((+) 3)。正如你在ghci中看到的那样,这两件事具有相同的类型。