Monad

前言

单子 (Monad),是范畴论中一个非常重要的概念。根据前面几篇文章对范畴论的介绍,我们来理解一下单子。

定义

维基百科中说

A monad is a certain type of endofunctor.

并且满足以下定义
范畴C上的monad,是一个三元组(F,µ,η),其中
F是范畴C上的自函子,
µ是F2到F的自然变换,µ:F2->F,
η是单位自函子I到F的自然变换,η:I->F
且需要满足以下的条件:

这里写图片描述


这里写图片描述

简单解释下也就是,Monad 其实是一类特殊的自函子,它需要有以上两个自然变换,且满足上面的条件。那么这个思想怎么运用到函数式编程当中的呢。

例子

我们以 C++ 语言写一个 Monad 的声明(由于语法的限制,不是很漂亮)。

template<template<class X> class T, class C>
class Monad {
public:
  T<C> uint(C c);
  T<C> join(T<T<C>> c);
};

就编程来讲,提供这类接口功能的类就是一个 Monad。

用途

那 Monad 的用途呢,已经有一篇写的比较好的文章了,我摘抄一下,如下:

点击此处

总结一下:
- 函子 Functor 是将一个普通函数应用到包裹的值;
- Applicative 应用一个包裹的函数到一个包裹的值 ;
- Monad 则是将一个会返回包裹的函数应用到一个被包裹的值上。
而有了这些特性后,就可以用 Monad 去解决一些副作用的问题了,这个就可以写出漂亮的纯函数。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值