应用式函子

在函数式编程中， 应用式函子，或简称应用式（applicative），是在函子和单子之间的中间结构。应用式函子允许函子式计算成为序列（不同于平常函子），但是不允许使用前面计算的结果于后续计算的定义之中（不同于单子）。应用式函子是范畴论中具有的的编程等价者。

应用式函子是2008年Conor McBride和Ross Paterson在他们的论文《Applicative programming with effects》中介入的。应用式函子在Haskell中最初作为库特征出现，现在已经传播到了其他语言，包括Idris、Agda、OCaml、Scala和F#。为了方便使用应用式函子编程，Glasgow Haskell和Idris二者现在提供了专门设计的语言特征。在Haskell中，应用式函子实现在Applicative类型类中。

 定义 

在Haskell中，应用式是参数化类型，被当作这个类型的数据的容器，加上两个方法：pure和。考虑一个参数化类型f a，类型f的一个应用式的pure方法有着类型：
pure :: a -> f a
它可被认为是把值带入应用式。类型f的应用式方法有着类型：
(<*>) :: f (a -> b) -> f a -> f b
它可被认为是在应用式内部函数应用的等价者。

可作为替代，不提供，转而提供一个叫做liftA2的函数。这两个函数都可以依据另一个来定义，因此在极小化完备定义中只需要其中一个。

应用式还要求满足四个方程式定律：
 同一：
 复合：
 同态：
 互换：

所有应用式都是函子。出于明确性，给定方法pure和，fmap可以被实现为：
fmap f x = pure f <*> x

常用的表示法等价于。

 例子 

在Haskell中，Maybe类型可以做成类型类Applicative的实例，使用下列定义：
instance Applicative Maybe where
    -- pure :: a -> Maybe a
    pure a = Just a

    -- (<*>) :: Maybe (a -> b) -> Maybe a -> Maybe b
    Nothing  <*> _        = Nothing
    _        <*> Nothing  = Nothing
    (Just g) <*> (Just x) = Just (g x)
如定义章节所述，pure将一个a转变成一个，而应用一个Maybe函数到一个Maybe值。对类型a使用Maybe应用式，允许在类型a的值上进行运算，其错误由应用式机制自动处理。例如，要加1到，只需要写：
(+1) <$> n
如果，则结果将是；而如果，则结果会是。这个例子还展示了应用式如何允许某种泛型函数应用。

 参见 
 类型类
 函子
 单子

引用

外部链接

 Description of the Applicative typeclass in the Haskell docs 
 Definition of the Applicative typeclass in the Glasgow Haskell Prelude

Category:函数式编程
Category:软件设计模式