应用编织者

定义

class Functor f => Applicative f where
    pure  :: a -> f a
    (<*>) :: f (a -> b) -> f a -> f b

注意 Functor 上的 Functor 约束。pure 函数返回嵌入在 Applicative 结构中的参数。中缀函数 <*>(发音为 apply)与 fmap 非常相似,除了 Applicative 结构中嵌入的函数。

Applicative 的正确实例应该满足适用法则,尽管编译器不强制执行这些法则

pure id <*> a = a                              -- identity
pure (.) <*> a <*> b <*> c = a <*> (b <*> c)   -- composition
pure f <*> pure a = pure (f a)                 -- homomorphism
a <*> pure b = pure ($ b) <*> a                -- interchange