学习Haskell的第11章介绍了以下定义:
instance Applicative ((->) r) where
pure x = (\_ -> x)
f <*> g = \x -> f x (g x)
Run Code Online (Sandbox Code Playgroud)
在这里,作者参与了一些不寻常的挥手("<*>的实例实现有点神秘,所以如果我们只是[在没有解释它的情况下显示它的话]它是最好的").我希望这里的某个人可以帮助我搞清楚.
根据应用类定义, (<*>) :: f (a -> b) -> f a -> f b
在实例中,替换((->)r)为f:r->(a->b)->(r->a)->(r->b)
所以第一个问题是,我该如何从这种类型中获得f <*> g = \x -> f x (g x)?
但即使我认为最后一个公式是理所当然的,我也很难同意我给GHCi的例子.例如:
Prelude Control.Applicative> (pure (+5)) <*> (*3) $ 4
17
Run Code Online (Sandbox Code Playgroud)
这个表达式看起来与之相符f <*> g = \x -> f (g x)(请注意,此版本x之后不会出现f. …