首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当我们谈论Monad时候(二)

先来看Optional,由于它只有两种“状态”,因此Haskell可以这么表示 data Optional a = Value a | Empty deriving Show 然后我们来实现它...Applicative是对“应用”抽象,它允许容器“存放”一个函数。 还是用例子来说明。一篇文章最后,我举了一个多参函数例子。当时我们封装了一个函数liftM2用来处理2参数函数。...Haskell全符号、被小括号包裹函数默认是中缀,比如这个函数调用就是中缀形式f xs。接受一个容器内函数和值,并将运算之后结果重新放在容器。...IO操作,这个优势还可以变得更加明显。Haskell采用Monad实现IO相关API,这个Monad就称为IO Monad。...调用形式看,>>=左侧是之前运算结果,而右侧通过λ参数将这个结果引入了进来,以供之后使用。但是左侧与右侧并没有联系,因此之后运算是无法依赖于之前运算

78710
您找到你想要的搜索结果了吗?
是的
没有找到

Monad来得更猛烈些吧_Haskell笔记11

P.S.能够从共享环境读取值,这也是称之为Reader Monad原因 三.State Monad 除日志追踪、共享环境外,还有一类最常见问题是状态维护 然而,有一些领域问题根本就是依赖于随着时间而改变状态...这让我们 Haskell 可以容易地处理状态问题,并让其他部份程序还是保持纯粹性。...s -> (a,s)状态操作函数,再包装成StateT >>=从左侧取出状态操作函数,传入s取出新状态s'和计算结果a,然后把右侧函数应用到计算结果a,又得到一个monadic value,再通过...五.Monad魅力 Monad能够赋予计算一些额外能力,比如: Writer Monad:能够把函数转换成带日志版本,用来追踪执行过程,或者给数据变换添加额外信息 Reader Monad:能够让一系列函数一个可控共享环境协同工作...,比如从这个环境读取参数,读取其它函数结果等等 State Monad:能够自动维护状态,适用于需要维护状态场景,比如生成一系列随机数 Error Monad:提供了一种错误处理机制,能够很方便地让运算更安全地进行

1.5K40

深入理解函数式编程(下)

React Hooks设计是很巧妙,以useEffect为例: 图 43 函数组件,useState用来产生状态使用useEffect时候,我们需要挂载这个state到第二个参数,而第一个参数给到运行函数...举个例子,面向对象里面的继承,我函数式编程可以使用组合compose或者高阶函数hoc来实现。 尽管实现是等价,但和面向对象编程范式对比,函数式编程有很多优点值得大家去尝试。...关键领域应用 因为函数式编程状态少、代码简洁等特点,使得它在交互复杂、安全性要求高领域有重要应用,像Lisp和Haskell就是因一波人工智能热而火起来,后来也一些特殊领域(银行、水利、航空航天等...可能调用栈溢出问题 惰性计算在一些电脑或特种程序架构可能有函数调用栈错误(超长调用链、超长递归),另外许多函数式编程语言需要编译器支持尾递归优化(优化为循环迭代)以得到更好性能。...你仍然可以.then函数写纯粹函数,也可以.then函数调用其他Promise,这就和IO Monad行为非常像。

90830

不可变状态

如果我们程序定义函数和数学函数一样,不依赖可变状态,也不产生副作用,那么我们就可以很好地解决之前提到问题。这也是为什么一些语言语法就鼓励不可变。...之前实现,我们显式地 labelTree 调用传递了状态,并将这个过程泛化到可以处理任意标签情况,我们此时可以发现,状态状态转变其实是一个非常一般情况,对于这样情况,我们可以构建一个新类型专门用来表示它...,尽管我们显式地类型上表示了状态、尽管状态依然是不可变、尽管我们确实能获得正确结果,但我们并没有去手工管理状态更新,状态 Monad 包裹传递。...,我们就会发现实际是 flatMap 在帮助我们管理了状态更新, flatMap ,trans 被调用,记录了状态转变,然后再通过传入 func 将结果进行转换,通过这个调用,使得整个状态转换管理工作被抽象出来...只不过 IO 所管理状态不是一个变量而是程序与整个世界之间交互所有 IO 操作。 Haskell ,IO Monad 是一个基础 Monad 6。

97420

当我们谈论Monad时候(一)

先前我某群提到,从Optional(也就是HaskellMaybe)理解Monad会是一个很不错方式。...之后,用Haskell作为过渡,最后讲讲理论相关内容。而第一篇作为工程部分,自然用是大家最喜欢Java主要是我最喜欢来讲解了。...不过我先打个预防针,本篇文章是站在工程角度浅显介绍,因此语言可能不甚严谨。 Monad是层数很高抽象 和Runnable一样,Monad是一个功能抽象。Java,我们可以用接口类来描述它。...MyFunctor娃,然后把一次次调用放在了map函数里。...下一篇文章,我将简单介绍HaskellMonad实现与一些有趣Monad,作为过渡。再下一篇,我将从理论角度(主要是范畴论)介绍Monad

40710

深入理解函数式编程(下)

React Hooks设计是很巧妙,以useEffect为例: 函数组件,useState用来产生状态使用useEffect时候,我们需要挂载这个state到第二个参数,而第一个参数给到运行函数...关键领域应用 因为函数式编程状态少、代码简洁等特点,使得它在交互复杂、安全性要求高领域有重要应用,像Lisp和Haskell就是因一波人工智能热而火起来,后来也一些特殊领域(银行、水利、航空航天等...可能调用栈溢出问题 惰性计算在一些电脑或特种程序架构可能有函数调用栈错误(超长调用链、超长递归),另外许多函数式编程语言需要编译器支持尾递归优化(优化为循环迭代)以得到更好性能。...你仍然可以.then函数写纯粹函数,也可以.then函数调用其他Promise,这就和IO Monad行为非常像。...相比于面向对象,这种方式组合上更方便简洁,更容易把复杂度降低,比如面向对象可能对象之间相互引用和调用是没有限制,这种模式带来是思考逻辑时候思维会发散。

45510

什么是 Monad (Functional Programming)?函子到底是什么?ApplicativeMonad

image.png fmap输入参数是a->b函数我们这个案例是(+3),然后定义一个函子Functor,这里是HaskellJust 2,最后返回一个新函子,我们案例,使用Haskell...澄清了函子含义,那么如何在程序中表达它? Haskell,函子是在其可以map over东西。稍微有一点函数式编程经验,一定会想到数组(Array)或者列表(List),确实如此。...单位元:存在一 M 内元素e,使得任一于 M 内 a 都会符合 ae = e*a = a 。 接着我们看看在自函子范畴,怎么结合幺半群定义得出Monad。...对于函数而言,结合律就是将函数以各种结合方式嵌套起来调用。我们将常用compose函数看作此处二元运算。...Haskell这类强类型语言中,我们甚至可以组装自己Tuple Monad

4.3K30

ctypesC共享库调用Python函数

概述 ctypes 是Python标准库中提供外部函数库,可以用来Python调用动态链接库或者共享库函数,比如将使用大量循环代码写在C语言中来进行提速,因为Python代码循环实在是太慢了...大致流程是通过 ctypes 来调用C函数,先将Python类型对象转换为C类型,C函数做完计算,返回结果到Python。这个过程相对是比较容易。...现在有个更复杂情况,我想要在C代码调用Python某些函数来完成C代码计算,比如在C代码sort函数,采用Python定义函数来进行大小判断。...这个Python定义函数 ctypes 称为回调函数 (callback function)。也就是说需要把Python函数当作变量传给C语言,想想还是有些难度。...然后Python文件定义这个回调函数具体实现,以及调用共享库my_lib.so定义foo函数: # file name: ctype_callback_demo.py import ctypes

29230

vuehtml标签{{}}内可以调用函数方法

今天领导提个需求,要求金额上强制保留两位小数,本想着后台直接返回数据时,带着两位小数,前端只是做个显示作用,后台说保留了小数但在传输过程中去掉了,可能他们做了格式转化。...没办法了只能又是我们前端操作了,牵扯价钱太多了,很多时候又有for 循环,怎么办呢? 思路:{{}}里面的是一个表达式,可不可以是个函数呢?...经测试是可以,具体实现方法如下: 写一个公共强制保留两位小数js方法 function toDecimal2 (x) { var f = parseFloat(x) if (isNaN(f....' } while (s.length <= rs + 2) { s += '0' } return s } export default { toDecimal2 } main.js...引用: import newPrice from '.

30.4K20

Monad_Haskell笔记10

P.S.关于computation context详细信息,见Functor与Applicative_Haskell笔记7 用来解决context相关计算另一个场景:怎样把一个具有context函数应用到具有...普通函数 + 普通值:函数调用 函数输入输出类型不一致情况 函数输入普通值,输出context里值 + context里值:Monad 函数输入普通值,输出context里值 + 普通值:直接调用...函数输入context里值,输出普通值 + context里值:直接调用 函数输入context里值,输出普通值 + 普通值:用pure包一下再调 所以,就这个场景(把是否处于context里函数应用到是否处于...) (>>) :: m a -> m b -> m b定义了默认实现,把函数\_ -> m b通过>>=应用到m a,用于(链式操作)忽略前面的计算结果 P.S.链式操作,把遇到>>换成>>=...与Applicative 回到最初场景,我们已经知道了Monad语法能够简化context相关计算,能够把a -> m b应用到m a 既然Monad建立Applicative基础之上,那么

71450

Monad

Monad不就是个自函子范畴幺半群,这有什么难理解(A monad is just a monoid in the category of endofunctors) —— Phillip Wadler...澄清了函子含义,那么如何在程序中表达它? Haskell,函子是在其可以map over东西。稍微有一点函数式编程经验,一定会想到数组(Array)或者列表(List),确实如此。...单位元:存在一 M 内元素e,使得任一于 M 内 a 都会符合 ae = e*a = a 。 接着我们看看在自函子范畴,怎么结合幺半群定义得出Monad。...对于函数而言,结合律就是将函数以各种结合方式嵌套起来调用。我们将常用compose函数看作此处二元运算。...Haskell这类强类型语言中,我们甚至可以组装自己Tuple Monad

1.3K50

learn-haskell

引言 Haskell不同于Scala,是一门纯函数式语言,它强制使用者使用函数式语法而没有妥协。 是一门强类型定义静态类型语言。...它**类型模型基于推断理论(in-ferred)**并被公认为是函数语言中最高效类型系统之一。你会发现该类型系统支持多态语义并有助于人们作出十分整洁清晰设计。...你也能在Haskell中发现Clojure风格惰性求值(lazyevaluation)以及与Clojure和Erlang相同列表推导语法。...无副作用,通过monad概念保存状态:一个Haskell函数可以返回一个有副作用并且会被延迟执行结果....Day1 逻辑 OS X下安装Haskell环境:brew install haskell-platform 通过命令启动交互式环境:ghci 基本类型 {- basic type -} Prelude

1.1K30

泛函编程(31)-泛函IO:Free Monad-Running free

实际Free Monad功能绝对不止如此,以heap换stack必须成为Free Monad运算模式,这样我们才可以放心使用Free Monad所产生Monadic编程语言了。...为了实现Free Monad在运行采用Trampoline运行机制,我们可以像Trampoline数据类型一样来实现resume,这个确定每一步运算方式函数: 1 trait Free[F[_],...前面介绍Free Monad相对都比较简单。实际Free MonadSuspend处理可以是很复杂,包括返回结果及接受输入等任何组合。...这正是Free Monad功能精妙之处:我们用Monad for-comprehension来编写一段Monadic program,然后Interpreter赋予它具体意义:用Interpreter...我们能够推导它Monad实例,那我们就可以调用foldMap了。

1.2K100

【单子】说白了不过就是【自函子范畴】一个【幺半群】而已?请说人话!!

怕生词概念同学先别慌,先告诉你 Monad 和 Promise 很像,增点亲切感; 浅尝 Monad 函数式编程我们一直强调:纯函数、纯函数、纯函数!无副作用,无副作用,无副作用!...(函子)和业务输出(链式操作)剥离开来,会让这个“转述”过程更准确、清晰; wiki Monad 没错,一小节 Monad 只说了它应用示例,此小 bar 来看看它在 wiki 【超干】...可以直接这样理解:Monad 是一种特殊数据结构,它能把值进行包装,然后链接执行;王垠《对函数式语言误解》准确了描述了 Monad 本质: Monad 本质是使用类型系统“重载”(overloading...阶段小结 函数式编程,处处都是惰性思维体现; Monad 也是惰性计算实践之一;至于标题中这句话:【单子】说白了不过就是【自函子范畴】一个【幺半群】而已?...推荐阅读 函数式语言宗教 图解 Monad JS Monad 学习函数式编程 Monad monadic.ts 如何解释 Haskell 单子(Monad

1K20

基于线程与基于事件并发编程之争

它们难以调试 回调并没有锁 多线程多核性能并不会比每个单核一个线程性能更好。...协调式多任务(协程)能让线程轻量等同于基于事件并发。 线程堆栈没有足够效率管理活动状态?不是,一个新动态增长性堆栈stack模型可以解决这个问题。 线程会阻止运行时刻进行优化调度决定?...从而也可以实现使用熟悉顺序编程风格编写出异步代码,下面是使用JS 7异步函数: ? Javascript 7主要亮点是事件机制和异步编程提升上,这两点主要体现在: 1....Haskell倡导者提出通过语言统一多线程编程和事件编程,提供一种Monad函数,其内部封装了事件和多线程抽象,无论你是哪派粉丝,都可以使用这个Monad编程。 ?...这种观点得到大多数人同意,这时被冷落一边ScalaActor模型站出来认为自己Actor函数属于这种两者合一Monad函数

1.2K10
领券