monad重新理解】的更多相关文章

monad是高阶抽象类型: 包含类型构造器: monad抽象的核心是类型封装和类型转化(map). 实现monad的的类型必须实现(基础)类型的封装和类型转化的功能: 在此基础上实现其他的功能(基本依赖于map): 实现类型的衍生功能依赖于map的实现:…
前言 近期又开始折腾起Haskell,掉进这个深坑恐怕很难再爬上来了.在不断深入了解Haskell的各种概念以及使用它们去解决实际问题的时候,我会试想着将这些概念移植到Swift中.函数式编程范式的很多概念在Swift等主打面向对象范式的语言中就像各种设计模式一样,优雅地帮助我们构建好整个项目,促使我们的代码更加的美观优雅.安全可靠. 本篇文章为"函数式编程"系列中的第二篇,我主要说下Monad的一些小概念,以及试图将Monad融入Swift中来让其为我们的实际工程项目作出贡献. 关于…
版权归作者所有,任何形式转载请联系作者. 作者:tison(来自豆瓣) 来源:https://www.douban.com/note/733279598/ Monad 在实际开发中的应用 不同的人会从不一样的角度接触 Monad.大多数网上的教程和介绍都从其严格的定义出发,加上几个玩具示例就当讲解完毕.诚然,不少 FP 的爱好者都是形式逻辑的拥趸或强于数学的,但是我对 Monad 的理解却不是从其定义入门的.相反,我是先频繁接触了其实例,这其中包括所有开发者都熟悉的列表(List),现代开发者应…
了解Haskell语言的朋友都知道它是一门纯函数式编程,输出结果只跟输入参数相关,这导致Haskell不能有输入输出函数,因为不同的环境下,输入相同,但输出可能有所不同.Haskell语言中,变量的值一旦被赋值,则不会再被修改,所以这也导致了它就无法输出——因为输出会改变屏幕.那Haskell中如何实现输入输出功能? Haskell中输入输出的功能是通过Monad方法实现的.本篇不讨论Haskell语言,只讨论基于C#下的Monad实现. 主要参考资料 一.介绍 Monads来自范畴论.在一篇优…
前言 JavaScript是一门多范式语言,即可使用OOP(面向对象),也可以使用FP(函数式),由于笔者最近在学习React相关的技术栈,想进一步深入了解其思想,所以学习了一些FP相关的知识点,本文纯属个人的读书笔记,如果有错误,望轻喷且提点. 什么是函数式编程 函数式编程(英语:functional programming)或称函数程序设计.泛函编程,是一种编程范式,它将计算机运算视为函数运算,并且避免使用程序状态以及易变对象.即对过程进行抽象,将数据以输入输出流的方式封装进过程内部,从而也…
作者:aaaron7 链接:https://www.zhihu.com/question/36756224/answer/88530013 如果是用 Haskell 的话,三篇文章足矣. prerequisite: 懂 state monad就行了 第一篇,<How to build a monadic interpreter in one day>http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.368.2522 跟着做,可以完成…
Atitit 理解Monad attilax总结 但函数式编程最大的一个问题是,函数是一个数学抽象,在现实世界中不存在,1 那既然这样就够用了,还要 Monad 干嘛?Monad 的作用在这里就体现出来了,它就是个加强的胶水函数1 但函数式编程最大的一个问题是,函数是一个数学抽象,在现实世界中不存在, 它必须被模拟出来.目前为止被广泛使用的计算机还是基于图灵机模型,计算机的寄存器.缓存.内存就是用来记录状态的.要真正懂得程序设计,必须知道没有状态的函数是如何在充满状态的计算机上实现的,所以还是绕…
大致介绍了幺半群(monoid)后,我们重新回顾最初引用wadler(haskell委员会成员,把monad引入haskell的家伙)的那句话: 现在我们来解读这句话中包含的另一个概念:自函子(Endofunctor),不过我们先需要一些铺垫: 首先,什么是函子(Functor)? 乍一看名字,以为函子(functor)对函数(function)是一种封装,实际没有关系,尽管他们都是表示映射,但两者针对的目标不一样. 函数表达的映射关系在类型上体现在特定类型(proper type)之间的映射,…
对于大多数刚刚入门函数式编程的同学来说,monad(单子.又叫单体)可能是这里面的一道坎.你可能对 map . flatMap 以及 filter 再熟悉不过,可是到了高阶的抽象层次上就又会变得一脸懵逼.其实每个人在学习的阶段都会经历这个过程,不过希望这篇文章能让你重新理解 monad 以及其他相关的概念. Optional Swift 作为一门类型安全的强类型语言,它在编译阶段就会对你的数据类型进行比较多的检查.因此,在 Swift 中我们遇到了一种新的数据类型,叫做 Optional .它的…
google到数学里定义的群(group): G为非空集合,如果在G上定义的二元运算 *,满足 (1)封闭性(Closure):对于任意a,b∈G,有a*b∈G (2)结合律(Associativity):对于任意a,b,c∈G,有(a*b)*c=a*(b*c) (3)幺元 (Identity):存在幺元e,使得对于任意a∈G,e*a=a*e=a (4)逆元:对于任意a∈G,存在逆元a^-1,使得a^-1*a=a*a^-1=e 则称(G,*)是群,简称G是群. 如果仅满足封闭性和结合律,则称G是…
1. 复合函数操作符 Prelude> :t (.) (.) :: (b -> c) -> (a -> b) -> a -> c Prelude> (.) ((+) 5) ((*) 2) 4 13 所以(.)操作符的作用,是将4作为参数传递给((*) 2)函数,再将结果传递给((+) 5)函数. 这就是数学里面的复合函数: f(x) = 2x g(x) = x + 5 g(f(x)) = g(2x) = (2x) + 5 = 2x + 5 g(f(4)) = 2*…
中间插播了几篇scalaz数据类型,现在又要回到Monad专题.因为FP的特征就是Monad式编程(Monadic programming),所以必须充分理解认识Monad.熟练掌握Monad运用.曾经看到一段对Monad的描述:“Monadic for-comprehension就是一种嵌入式编程语言,由它的Monad提供它的语法”.但如果每一种Monad的for-comprehension都独立提供一套语法的话,这种编程语言就显得十分单调.功能简单了.那么既然是FP,我们应该可以通过函数组合…
我们经常提到函数式编程就是F[T].这个F可以被视为一种运算模式.我们是在F运算模式的壳子内对T进行计算.理论上来讲,函数式程序的运行状态也应该是在这个运算模式壳子内的,也是在F[]内更新的.那么我们就应该像函数式运算T值一样,也有一套函数式更新程序状态的方法.之前我们介绍了Writer Monad.Writer也是在F[]内维护Log的,可以说是一种状态维护方式.但Writer的Log是一种Monoid类型,只支持Semigroup的a|+|b操作,所以只能实现一种两段Log相加累积这种效果.…
Monad Reader就是一种函数的组合.在scalaz里函数(function)本身就是Monad,自然也就是Functor和applicative.我们可以用Monadic方法进行函数组合: import scalaz._ import Scalaz._ object decompose { //两个测试函数 val f = (_: Int) + //> f : Int => Int = <function1> val g = (_: Int) * //> g : In…
在前面的几篇讨论里我们初步对FP有了些少了解:FP嘛,不就是F[A]吗?也是,FP就是在F[]壳子(context)内对程序的状态进行更改,也就是在F壳子(context)内施用一些函数.再直白一点就是在F壳子内进行OOP惯用的行令编程(imperative programming).当然,既然是在壳子(context)内进行编程这种新的模式,那么总需要些新的函数施用方法吧.我们再次审视一下以前了解过的FP函数施用方法: // Functor : map[A,B] (F[A])(f: A =>…
前面提到了scalaz是个函数式编程(FP)工具库.它提供了许多新的数据类型.拓展的标准类型及完整的一套typeclass来支持scala语言的函数式编程模式.我们知道:对于任何类型,我们只需要实现这个类型的typeclass实例就可以在对这个类型施用所对应typeclass提供的所有组件函数了(combinator).突然之间我们的焦点好像都放在了如何获取typeclass实例上了,从而忽略了考虑为什么要使用这些typeclass及使用什么样的typeclass这些问题了.所以可能有人会问我:…
Monad typeclass不是一种类型,而是一种程序设计模式(design pattern),是泛函编程中最重要的编程概念,因而很多行内人把FP又称为Monadic Programming.这其中透露的Monad重要性则不言而喻.Scalaz是通过Monad typeclass为数据运算的程序提供了一套规范的编程方式,如常见的for-comprehension.而不同类型的Monad实例则会支持不同的程序运算行为,如:Option Monad在运算中如果遇到None值则会中途退出:State…
泛函编程的核心模式就是函数组合(compositionality).实现函数组合的必要条件之一就是参与组合的各方程序都必须是纯代码的(pure code).所谓纯代码就是程序中的所有表达式都必须是Referentially Transparent(RT,等量可替换的),它的意思是:在一段程序p中,所有的表达式e都可以用e的运算结果替代而不影响到p的运算结果,那么e就是RT等量可替换的,也就是说程序p是由纯代码组成的.但如果程序p中包含了一些变量,这些变量的状态就会影响到程序中e的运算结果,那么p…
看到一遍好文章,与我的想法如出一辙,先转为敬.首先说说我对Monad和promise的理解: Monad的这种抽象方式是为了简化程序中不确定状态的判断而提出的,能够让程序员从更高的层次顺序描述程序逻辑的每一个动作,而不必关注每一个动作是否会出现异常,也不必关注第一个动作内是否需要逻辑判断,是否要跳转.haskell趣学指南我翻了好几遍,终于对Monad这个概念有了一点认识,这个抽象是伟大的,它极大提高了程序的可读性,同时降低了开发难度.这里还要推荐一下haskell这门语言,Monad的概念就是…
这是观看Cousera上的课程<Principles of Reactive Programming>中week1里的Monad一节所做的笔记. What is a Monad? What is a Monad? A monad is a parametric type M[T] with two operations, flatMap and unit, that have to satisfy some laws. 这里是说Monad是一类特殊的类型,它有两个方法, flatMap和uni…
前言 Swift 其实比 Objective-C 复杂很多,相对于出生于上世纪 80 年代的 Objective-C 来说,Swift 融入了大量新特性.这也使得我们学习掌握这门语言变得相对来说更加困难.不过一切都是值得的,Swift 相比 Objective-C,写出来的程序更安全.更简洁,最终能够提高我们的工作效率和质量. Swift 相关的学习资料已经很多,我想从另外一个角度来介绍它的一些特性,我把这个角度叫做「烧脑体操」.什么意思呢?就是我们专门挑一些比较费脑子的语言细节来学习.通过「烧…
一个单子(Monad)说白了不过就是自函子范畴上的一个幺半群而已,这有什么难以理解的?* 之前了解了下Monad,后来一段时间没碰,最近研究Parser用到Monad时发现又不懂了.现在重新折腾,趁着记忆还热乎,赶紧写下来.本文不会完整讲解Monad,而只介绍Monad相关的思想与编程技巧. 不要被唬人的数学概念吓唬到了.对于程序员来说,Monad不过就是一种编程技巧,或者说是一种设计模式. Monad并非Haskell特有.实际上,大部分语言都有应用过Monad的思想.下面我将主要使用Sche…
最近几年,函数式编程变得越来越流程,其代码简洁.副作用小.维护成本低等特点,使得许多其它的语言也开始支持函数式编程,比如Java 和 C#等.本文主要介绍一下函数式编程中的一个重要概念:Monad.      从定义上看,Monad就是两个接口:一个是return,另一个是一个bind:只要实现这两个操作的类型,都是monad.但是在理解Monad之前,先要搞清楚两个概念:Functors 和 Applicatives:    1. Functors 定义:把一个函数作用在数值类型(对值类型的封…
原文地址:Haskell学习-monad 什么是Monad Haskell是一门纯函数式的语言,纯函数的优点是安全可靠.函数输出完全取决于输入,不存在任何隐式依赖,它的存在如同数学公式般完美无缺.可是纯函数因为隔绝了外部环境,连最基本的输入输出都无法完成.而 Monad 就是 Haskell 给出的解决方案.但Monad 并不仅仅是 IO 操作的抽象,它更是多种类似操作之间共性的抽象.所以 Monad 解决的问题并不局限在 IO 上,像 Haskell 中的 Maybe 和 [] 都是 Mona…
目录 一. 划重点 二. flatMap功能解析 三. flatMap的推演 3.1 函数式编程基础知识回顾 3.2 从一个容器的例子开始 3.3 Monad登场 3.4 对比总结 3.5 一点疑问 四. 资料参考 本文是Rxjs 响应式编程-第二章:序列的深入研究这篇文章的学习笔记. 示例代码托管在:http://www.github.com/dashnowords/blogs 更多博文:<大史住在大前端>目录 一. 划重点 文中使用到的一些基本运算符: map-映射 filter-过滤 r…
译者按: 近年来,函数式语言的特性都被其它语言学过去了. 原文: Functional Computational Thinking — What is a monad? 译者: Fundebug 为了保证可读性,本文采用意译而非直译.另外,本文版权归原作者所有,翻译仅用于学习. 如果你使用函数式编程,不管有没有用过函数式语言,在某总程度上已经使用过Monad.可能大多数人都不知道什么叫做Monad.在这篇文章中,我不会用数学公式来解释什么是Moand,也不使用Haskell,而是用JavaSc…
scala中的Option类型是个很好用的数据结构,用None来替代java的null可以大大降低代码的复杂性,它还是一个更容易解释的状态表达形式,比如在读取数据时我们用Some(Row)来代表读取的数据行Row,用None来代表没有读到任何数据,免去了null判断.由此我们可以对数据库操作的结果有一种很直观的理解.同样,我们又可以用Either的Right(Row)来代表成功运算获取了结果Row,用Left(Err)代表运算产生了异常Err.对于数据库编程我还是选择了Task[Either[E…
理解 Continuation (2012-08-26 10:39:34)     终于,我也不能免俗地要来谈谈这几个 Schemer 的必谈话题(顺便山寨了一个标题). Scheme 是一门神奇的编程语言,它不仅是世界上第一个完整支持闭包(closure)的语言,也是世界上第一个提供 continuation 的语言.你可以看到 wiki 上几个关于 Continuation 的条目全部用 Scheme 作为示例语言.如无特指,本文以及接下来的两篇文章中凡是提到 continuation 的地…
本系列是在学习Monad时在网上找到的一个老外的博客,作者是MikeHadlow,地址是mikehadlow.blogspot.com,  可惜国内访问不了.这个系列对Monad讲解的浅显易懂,而且有实例代码,认真读完后基本了解Monad是怎么回事,因此花了几天将其翻译出来留存,翻译过程基本直译,去掉了一些不影响理解的语句 Monad的重点 创建我们第一个Monad Linq怎么支持Monad Monad Maybe 介绍一个简单的parser 将我们的parser转换成Monad…
Functor.Applicative 和 Monad Posted by 雷纯锋Nov 8th, 2015 10:53 am Functor.Applicative 和 Monad 是函数式编程语言中三个非常重要的概念,尤其是 Monad ,难倒了不知道多少英雄好汉.事实上,它们的概念是非常简单的,但是却很少有文章能够将它们描述清楚,往往还适得其反,越描越黑.与其它文章不同的是,本文将从结论出发,层层深入,一步步为你揭开它们的神秘面纱. 说明:本文中的主要代码为 Haskell 语言,它是一门…