Monad是非常强有力的概念,在介绍Monad是什么和如何工作的之前,我们应该先确认Monad能解决什么问题。Monad是各种编程问题的的 meta solution,它不是某种特定问题的解决方案,我们将通过一些例子来介绍Monad.

Monad是使用amplified type组合函数的模式,ampified type可以看做是带一个泛型参数的泛型类型. IEnumerable<T>是个很好的例子。Monad可以去除丑陋和重复的代码,简化很多编程问题的处理。它是来自数学里的范畴论分支里的概念,最初被用在Haskell语言里

通常编程时我们会操作值,值可以是简单的内置于语言的类型,比如,int,bool,string,或者是我们自己定义的复杂类型,比如Customer。这些值会被传递并做各种处理. 最理想的编程是编程语言可以让我们优美的表达我们的目的.

bool IsGreaterThanTen(int value)
{
return value > 10;
}

我们可以很容易使用这个函数:

if(IsGreaterThanTen(x)
{
//do something
)

但是如果我们的函数会抛出 异常呢?

bool IsAFactorOfTwelve(int value)
{
if(value==0) throw new Exception("Can't divide by zero"); return (12 % value ) == 0;
}

现在我们必须使用样板式的 Try catch包裹它

try
{
if(IsAFactorOfTwelve(x))
{
//do something }
catch(Exception e)
{
// handle the exception
}

如果我们的函数可以返回null呢 ?

string Trim(string value)
{
if(value==null) return null; return value.Trim();
}

那么我们现在必须要要插入一些样板代码来检查是否是null

var trimmedValue=Trim(inputValue)
if(trimmedValue == null)
{
//so something different here
}

每次添加样板代码都会使模糊我们的代码功能,使我们的代码难写难读,而且更容易产生bug。样板式代码与我们的代码功能并不相关,它可能是try-catch块,null检查, 重复,或者其他使我们违反DRY原则的代码

这里有一个更有启迪性的例子。 怎样处理list或者collection呢(如果不使用Linq和相关的扩展方法),任何时候访问List和Collection里的值都需要加一个foreach循环, 这更加样板

foreach(var member in Range(5,10))
{
//do something with the number
}

IEnumberable<int>是泛型类型,我们也可以认为它是amplified type. 它表示整数的结合而不是单一整数。 我们也可以用amplified type表示其他东西。在上面的Trim例子里我们可以返回一个Nullable<string>(假定Nullable可以用于引用类型), 我们其实增强(amplify)string为一个既可以是string又可以是null的类型。在C#里对于引用类型这种增强是隐式的,如果可以支持直接返回Nullablle的引用类型会更好。

我们也可以想象让IsAFactOfTwelve函数返回一个IMightThrowAnException<bool>,这样会让代码的意图更明确, 它返回一个增强的bool,既可以是bool也可以是一个异常. 当然C#的函数都有一个隐式的Exception返回类型。如果函数签名能告诉我们它可能返回的异常会更好。

Monad使我们可以处理这些amplified type,允许我们去掉样板代码. 它可以帮助我们写声明式的程序,解决程序员的核心问题,控制复杂度,从而使我们的代码更清晰.

Monad的重点的更多相关文章

  1. Monad 系列

    本系列是在学习Monad时在网上找到的一个老外的博客,作者是MikeHadlow,地址是mikehadlow.blogspot.com,  可惜国内访问不了.这个系列对Monad讲解的浅显易懂,而且有 ...

  2. Scalaz(25)- Monad: Monad Transformer-叠加Monad效果

    中间插播了几篇scalaz数据类型,现在又要回到Monad专题.因为FP的特征就是Monad式编程(Monadic programming),所以必须充分理解认识Monad.熟练掌握Monad运用.曾 ...

  3. Scalaz(14)- Monad:函数组合-Kleisli to Reader

    Monad Reader就是一种函数的组合.在scalaz里函数(function)本身就是Monad,自然也就是Functor和applicative.我们可以用Monadic方法进行函数组合: i ...

  4. Scalaz(12)- Monad:再述述flatMap,顺便了解MonadPlus

    在前面的几篇讨论里我们初步对FP有了些少了解:FP嘛,不就是F[A]吗?也是,FP就是在F[]壳子(context)内对程序的状态进行更改,也就是在F壳子(context)内施用一些函数.再直白一点就 ...

  5. 泛函编程(28)-粗俗浅解:Functor, Applicative, Monad

    经过了一段时间的泛函编程讨论,始终没能实实在在的明确到底泛函编程有什么区别和特点:我是指在现实编程的情况下所谓的泛函编程到底如何特别.我们已经习惯了传统的行令式编程(imperative progra ...

  6. Monad学习

    这是观看Cousera上的课程<Principles of Reactive Programming>中week1里的Monad一节所做的笔记. What is a Monad? What ...

  7. 【响应式编程的思维艺术】 (3)flatMap背后的代数理论Monad

    目录 一. 划重点 二. flatMap功能解析 三. flatMap的推演 3.1 函数式编程基础知识回顾 3.2 从一个容器的例子开始 3.3 Monad登场 3.4 对比总结 3.5 一点疑问 ...

  8. Functor& Monad解读

    整体上代表封装的概念,重点是函数的封装,及函数运行的上下文环境.trait Functor[F[_]] Functor:代表整体封装: F[_]:代表封装后的目标域. A.B:代表普通的对象:f:代表 ...

  9. monad-本质解释- a monad is a design pattern--monad与泛型相关

    monad的特征: 类型转化+添加新的操作. monad  RACStream RACSignal RACSubject monad:单一体,(不可分的)个体 以计算为中心的封装. In functi ...

随机推荐

  1. 测试 Zoundry Raven

    安装很方便,看看发布的内容是否好用 但发现从博客上取下来的内容是有问题的,不能正常打开

  2. layer自定义弹窗样式

    1.下载并引用js, 官网http://layer.layui.com/ 文档http://www.layui.com/doc/modules/layer.html <link href=&qu ...

  3. Markdown 常用语法总结

    注意:Markdown使用#.+.*等符号来标记,符号后面必须跟上至少跟上 1个空格才有效! Markdown的常用语法 标题 Markdown标题支持两种形式. 1.用#标记 在标题开头加上1~6个 ...

  4. python 遍历xml所有节点

    1.xml文件 2.代码 #coding:utf-8 import xml import xml.etree.ElementTree as ET """ 实现从xml文件 ...

  5. loadrunner录制不了

    我在使用loadrunner过程中遇到的问题是,录制脚本时候能够打开firefox,但是无法打开IE,降低IE版本以后仍然不行. 1.在录制脚本时Start Recoding中,默认如下,这样有可能I ...

  6. 非传统题初探——AtCoder Practice Contest #B - インタラクティブ練習 (Interactive Sorting)

    原题: Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statement This is an interac ...

  7. 洛谷P1141 01迷宫【DFS】

    有一个仅由数字00与11组成的n \times nn×n格迷宫.若你位于一格0上,那么你可以移动到相邻44格中的某一格11上,同样若你位于一格1上,那么你可以移动到相邻44格中的某一格00上. 你的任 ...

  8. 洛谷P1012 拼数【字符串+排序】

    设有nn个正整数(n≤20)(n≤20),将它们联接成一排,组成一个最大的多位整数. 例如:n=3n=3时,33个整数1313,312312,343343联接成的最大整数为:3433121334331 ...

  9. [poj3565] Ants (二分图带权匹配)

    传送门 Description 年轻自然主义者比尔在学校研究蚂蚁. 他的蚂蚁以苹果树上苹果为食. 每个蚁群都需要自己的苹果树来养活自己. 比尔有一张坐标为 n 个蚁群和 n 棵苹果树的地图. 他知道蚂 ...

  10. C#学习笔记_01_基础内容

    01_基础内容 进(位)制 十进制:逢10进1,数字由0-9组成: 二进制:逢2进1,数字由0-1组成: 八进制:逢8进1,数字由0-7组成: 十六进制:逢16进1,数字由0-9和a-f组成: 进制转 ...