在函数式编程中, 应用式函子,或简称应用式(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
如果,则结果将是;而如果,则结果会是。这个例子还展示了应用式如何允许某种泛型函数应用。
参见
- 类型类
- 函子
- 单子
引用
外部链接
- [https://hackage.haskell.org/package/base-4.14.1.0/docs/Control-Applicative.html Description of the Applicative typeclass in the Haskell docs]
- [http://hackage.haskell.org/package/base/docs/src/GHC.Base.html#Applicative Definition of the Applicative typeclass in the Glasgow Haskell Prelude]
评论 (0)