函数式编程:Functor、Applicative 和 Monad

本文深入探讨函数式编程中的重要概念——Functor、Applicative 和 Monad,通过 Haskell 语言举例,揭示它们的本质。Functor 允许将函数应用于上下文中的值,Applicative 允许应用上下文中的函数到上下文中的值,而 Monad 是增强版的 Applicative,允许应用接收普通值但返回上下文中的值的函数。Maybe 类型作为示例,展示了如何实现这三个 typeclass。最后,文章提及 Monad 在 ReactiveCocoa 中的应用。
摘要由CSDN通过智能技术生成

Functor、Applicative 和 Monad 是函数式编程语言中三个非常重要的概念,尤其是 Monad ,难倒了不知道多少英雄好汉。事实上,它们的概念是非常简单的,但是却很少有文章能够将它们描述清楚,往往还适得其反,越描越黑。与其它文章不同的是,本文将从结论出发,层层深入,一步步为你揭开它们的神秘面纱。

说明:本文中的主要代码为 Haskell 语言,它是一门纯函数式的编程语言。其中,具体的语法细节,我们不需要太过关心,因为这并不影响你对本文的理解。

结论

关于 Functor、Applicative 和 Monad 的概念,其实各用一句话就可以概括:

  1. 一个 Functor 就是一种实现了 Functor typeclass 的数据类型;

  2. 一个 Applicative 就是一种实现了 Applicative typeclass 的数据类型;

  3. 一个 Monad 就是一种实现了 Monad typeclass 的数据类型。

当然,你可能会问那什么是 typeclass 呢?我想当你在看到实现二字的时候,就应该已经猜到了:

A typeclass is a sort of interface that defines some behavior. If a type is a part of a typeclass, that means that it supports and implements the behavior the typeclass describes. A lot of people coming from OOP get confused by typeclasses because they think they are like classes in object oriented languages. Well, they’re not. You can think of them kind of as Java interfaces, only better.

是的,typeclass 就类似于 Java 中的接口,或者 Objective-C 中的协议。在 typeclass 中定义了一些函数,实现一个 typeclass 就是要实现这些函数,而所有实现了这个 typeclass 的数据类型都会拥有这些共同的行为。

那 Functor、Applicative 和 Monad 三者之间有什么联系吗,为什么它们老是结队出现呢?其实,Applicative 是增强型的 Functor ,一种数据类型要成为 Applicative 的前提条件是它必须是 Functor ;同样的,Monad 是增强型的 Applicative ,一种数据类型要成为 Monad 的前提条件是它必须是 Applicative 。注:这个联系,在我们看到 Applicative typeclass 和 Monad typeclass 的定义时,自然就会明了。

Maybe

在正式开始介绍 Functor、Applicative 和 Monad 的定义前,我想先介绍一种非常有意思的数据类型,Maybe 类型(可类比 Swift 中的 Optional):

The Maybe type encapsulates an optional value. A value of type Maybe a either contains a value of type a (represented as Just a), or it is empty (represented as Nothing). Using Maybe is a good way to deal with errors or exceptional cases without resorting to drastic measures such as error.

Maybe 类型封装了一个可选值。一个 Maybe a 类型的值要么包含一个 a 类型的值(用 Just a 表示);要么为空(用 Nothing 表示)。我们可以把 Maybe 看作一个盒子,这个盒子里面可能装着一个 a 类型的值,即 Just a ;也可能是一个空盒子,即 Nothing 。或者,你也可以把它理解成泛型,比如 Objective-C 中的 NSArray。不过,最正确的理解应该是把 Maybe 看作一个上下文,这个上下文表示某次计算可能成功也可能失败,成功时用 Just a 表示,a 为计算结果;失败时用 Nothing 表示,这就是 Maybe 类型存在的意义:

blob.png

data Maybe a = Nothing | Just a

下面,我们来直观地感受一下 Maybe 类型:

ghci> Nothing
Nothing
ghci> Just 2
Just 2

我们可以用盒子模型来理解一下,Nothing 就是一个空盒子;而 Just 2 则是一个装着 2 这个值的盒子:

blob.png

提前剧透:Maybe 类型实现了 Functor typeclass、Applicative typeclass 和 Monad typeclass ,所以它同时是 Functor、Applicative 和 Monad ,具体实现细节将在下面的章节进行介绍。

Functor

在正式开始介绍 Functor 前,我们先思考一个这样的问题,假如我们有一个值 2 :

blob.png

我们如何将函数 (+3) 应用到这个值上呢?我想上过小学的朋友应该都知道,这就是一个简单的加法运算:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值