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