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

Monadic Function_Haskell笔记12

并且对于遵守Functor laws和Monad laws的类型,这两个函数是完全等价的,例如: > liftM (+1) (Just 1) Just 2 > fmap (+1) (Just 1) Just...> f c能够把一个二元函数应用到两个monadic value(分别是p x和ma)上,再返回一个monadic value。...如果只喂给foldr一个参数,要求是个二元函数a -> b -> b,要求第二个参数和返回值类型相同,所以应该换个姿势看f': f' :: Monad m => t -> (a -> m b) -> (...) 理解起来也很容易,f' :: Monad m => t -> (a -> m b) -> (a -> m b)接受两个参数,返回一个a -> m b的函数(之前是接受3个参数,返回一个m b值) 类似的...(subtract 1)) Just 4.0 用来组合一系列Monad m => a -> m a的函数,组合顺序也是从右向左

93430

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

比如我们想写一个函数 h: A -> C 然后手头有两个子函数: f: A -> B g: B -> C 于是我们用一个胶水函数 fun compose(f,g): A->C{ return {...Monad工作原理包含两个部分:对原范畴组合成新的范畴,这个范畴对于Monad来说必须是幺半群Monoid,可以认为Monad是一系列自函子的组合,这种组合是一种转换,转换的结果是Monoid。...函数identity是一个自函数的特例,它接收什么参数就返回什么参数,所以入参和返回值不仅类型一致,而且值也相同。...假设两个范畴是 C和D, 其函函子是: functor F: C -> D 函子functor原理   函数组合的方式有其特殊地方,这个特殊主要是由于我们组合的对象是函数,如果组合的对象是整数类型,两个整数组合成一个整数...(组合箭头和元箭头映射这里省略) 函子这种映射实际是一种分解组合方式,对于这个过程我们可以用下面模拟形象地理解: 计算C集合中每个函数的"结果", 但是不组合它们.

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

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

    恰恰,Monad是不支持函数组合的。...可惜,不是所有Monad都支持函数组合的,看下面: def composeMonad[M[_],N[_]](ma: Monad[M], mb: Monad[N]): Monad[({type mn[x...因为Either有两个类型参数,我们实际上也可以直接用type lambda来表示Result[A]: type Result[A] = OptionT[({type l[x] = \/[String,...与重新构建另一个类型不同的是,通过Monad Transformer叠加Monad组合形成类型的操作依然使用各组成Monad的操作函数,这些函数运算结果类型任然是对应的Monad类型,所以需要一些升格函数...的确,用Monad Transformer组合Monad后可以实现成员Monad的效果叠加。 不过,在实际应用中两层以上的Monad组合还是比较普遍的。

    79460

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

    Monad Reader就是一种函数的组合。在scalaz里函数(function)本身就是Monad,自然也就是Functor和applicative。...我们可以用Monadic方法进行函数组合: 1 import scalaz._ 2 import Scalaz._ 3 object decompose { 4 //两个测试函数 5 val...这就要求下一个函数的输入参数类型必需是B 3、M必须是个Monad;这个可以从Kleisli的操作函数实现中看出:scalaz/Kleisli.scala 1 /** alias for `andThen...输出Monad一致统一,都是Option。 那么,Kleisli到底用来干什么呢?它恰恰显示了FP函数组合的真正意义:把功能尽量细分化,通过各种方式的函数组合实现灵活的函数重复利用。...也就是在FP领域里,我们用Kleisli来组合FP函数。

    77650

    ✨从纯函数讲起,一窥最深刻的函子 Monad

    紧扣定义,满足以下两个条件的函数可以称作纯函数: 如果函数的调用参数相同,则永远返回相同的结果。它不依赖于程序执行期间函数外部任何状态或数据的变化,必须只依赖于其输入参数。...其实我们也能看出只有纯函数的组合才能更利于写出无形参风格的代码,看起来更优雅~ Monad 前面一直强调:纯函数!无副作用! 谈何容易?...我们可以把不纯的函数用一间间黑色屋子装起来,最后一刻再亮灯,这样能保证在亮灯前一刻,一直都是“纯”的。 这些屋子就是单子 —— “Monad”!...readFile、print、tail 函数最开始并非是纯函数,都有副作用操作,比如读文件、打印日志、修改数据,然而经过用 Monad 封装之后,它们可以等效为一个个纯函数,然后通过链式绑定,最后调用执行...写纯函数、组合纯函数、简化运算纯函数、无形参风格、纯函数的链式调用、Monad 封装不存的函数让它看起来“纯”~ 纯,就是这个味儿!

    43310

    编程范式 —— 函数式编程入门

    在函数式编程中数据在由纯函数组成的管道中传递。 函数式编程可以用简单如交换律、结合律、分配律的数学之法来帮我们简化代码的实现。...= a => (b, c) => a + b + c add(1)(2, 3) 可组合: 函数之间能组合使用 const add = (x) => x + x const mult = (x) =>...add(1, 2, 3) // 6 假如有这样一个 curry 函数, 用其包装 add 函数后返回一个新的函数 curryAdd, 我们可以将参数 a、b 进行分开传递进行调用。..., 必须手动声明传入参数 arr, 是否能提供一个 compose 函数让使用者更加友好的使用呢?...Left 函子 或 Right 函子 作一层筛选, 其接收 f、g 两个函数以及一个函子(Left or Right) var Either = function(f, g, functor) {

    70710

    泛函编程(30)-泛函IO:Free Monad-Monad生产线

    (parameter injection)方式:在transfer函数输入参数中注入context object。...那么这个函数是无法实现函数组合(function composition)。transfer函数就不是一个泛函编程人员该使用的函数了。...也许我们应该从泛函编程角度来尝试设计这个函数:用泛函编程提倡的不可蜕变(immutability)方式来设计,也就是向函数调用方返回一些东西。...不过要把Interact变成Monad就必须实现unit和flatMap两个函数,检查Interact trait,明显这是不可能的。 那我们把下面的努力都应该放在如何转变成Monad这方面了。...Free Monad的两项功能分别是Monad,和Interpreter(解译器)。我们用Monad描述程序算法,用Interpreter解译程序形成针对特定运行环境的可运行代码。

    1.1K70

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

    React Hooks的设计是很巧妙的,以useEffect为例: 在函数组件中,useState用来产生状态,在使用useEffect的时候,我们需要挂载这个state到第二个参数,而第一个参数给到的运行函数在...如果用 TypeScript 来表示,会不会更清晰一点? 看起来Monad只是一个实现了fmap的对象(Functor类型,mappable接口)而已。...因此,这里用**Maybe(..)**构造可能让我们难以理解。 如果非要理解的话,可以理解Maybe为Nothing和Just的抽象类,Just和Nothing构成这个抽象类的两个实现。...设计一个请求模块 用这种方式构建的模块,组合和复用性很强,你也可以利用lodash的其他库对req做一个其他改造。...语义化 一个个小的函数分别完成一种小的功能,当你需要组合上层能力的时候,基本可以按照函数语义来进行快速组合。 惰性计算 被组合的函数只会生成一个更高阶的函数,最后调用时数据才会在函数之间流动。

    49310

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

    React Hooks的设计是很巧妙的,以useEffect为例: 图 43 在函数组件中,useState用来产生状态,在使用useEffect的时候,我们需要挂载这个state到第二个参数,而第一个参数给到的运行函数在...如果用TypeScript来表示,会不会更清晰一点? 图 48 看起来Monad只是一个实现了fmap的对象(Functor类型,mappable接口)而已。...因此,这里用Maybe(..)构造可能让我们难以理解。 如果非要理解的话,可以理解Maybe为Nothing和Just的抽象类,Just和Nothing构成这个抽象类的两个实现。...4.1 设计一个请求模块 图 66 用这种方式构建的模块,组合和复用性很强,你也可以利用lodash的其他库对req做一个其他改造。...语义化 一个个小的函数分别完成一种小的功能,当你需要组合上层能力的时候,基本可以按照函数语义来进行快速组合。 惰性计算 被组合的函数只会生成一个更高阶的函数,最后调用时数据才会在函数之间流动。

    97530

    纯函数与领域模型

    具有引用透明特征的纯函数更加贴近数学中的函数概念:没有计算,只有转换。转换操作不会修改输入参数的值,只是基于某种规则把输入参数值转换为输出。...这种组合性如下图所示: ? 图中的andThen是Scala语言提供的组合子,它可以组合两个函数形成一个新的函数。Scala还提供了compose组合子,二者的区别在于组合函数的顺序不同。...,函数式编程中的Monad模式也支持组合。...它本质上是Monad的语法糖,组合了flatMap、map与filter等函数;但从语法上看,却类似一个for循环,这就使得我们多了一种可读性更强的调用Monad的形式。...、分散的、可组合的,接下来就可以利用纯函数与Monad的组合能力,编写满足业务场景需求的实现代码: val order = ... // 组合验证逻辑 // 注意返回的orderValidated也是一个

    1.1K10

    泛函编程(32)-泛函IO:IO Monad

    由于泛函编程非常重视函数组合(function composition),任何带有副作用(side effect)的函数都无法实现函数组合,所以必须把包含外界影响(effectful)副作用不纯代码...这样我们就可以顺利地在这个纯代码核心中实现函数组合。IO Monad就是泛函编程处理副作用代码的一种手段。...现在,有了这个IO类型,我们可以放心地用函数组合的泛函编程方式围绕着这个IO类型来编写IO程序,因为我们知道通过这个IO类型我们把副作用的产生推延到IO程序之外的IO解译器里,而IO编程与解译器是两个各自独立的程序...泛函模式的IO编程就是把IO功能表达和IO副作用产生分开设计:IO功能描述使用基于IO Monad的Monadic编程语言,充分利用函数组合进行。...在解译的过程中逐步用flatMap运行非纯代码。 我们可以用Free Monad的结构替代IO类型结构,这样我们就可以用Monadic编程语言来描述IO程序。

    2.5K70

    当我们谈论Monad的时候(二)

    不过由于列表可以是任意长的,因此需要定义一个链状的结构 data List a = Nil | Cons a (List a) infixr 5 `Cons` 在Haskell中,用`包裹的函数可以作为中缀函数使用...Applicative是对“应用”的抽象,它允许在容器中“存放”一个函数。 还是用例子来说明。上一篇文章的最后,我举了一个多参函数的例子。当时我们封装了一个函数liftM2用来处理2参数的函数。...因此我们可以遍历所有可能的函数-值组合,因此我们只需要两次lmap。比如对于给定的函数列表fx与值列表xs,lmap (`lmap` xs) fx先遍历fx再遍历xs。...它的行为就是取第一个参数m a的值,将其应用在第二个参数的函数(这个函数也叫monadic map)。由于这个函数并不是在容器中的,因此>>=的实现比起Applicative要更容易些。...我们之前实现的List在处理多参数时会遍历所有可能组合(笛卡尔积),而ZipList更贴近使用习惯,它会按照同一个位置的元素来遍历多个列表。

    81310

    泛函编程(26)-泛函数据类型-Monad-Applicative Functor Traversal

    我们又说所有Monad都是Applicative,因为我们可以用flatMap来实现map2,但不是所有数据类型的flatMap都可以用map2实现,所以反之不是所有Applicative都是Monad...Applicative注重于各种类型的函数施用,也就是map。包括普通函数的施用及在高阶类型结构内的函数施用,还有多参数函数的连续施用。...表面上看来Monad已经覆盖了Functor, Applicative。可能就是因为Monad的功能太强大了,所以Monad的函数组合(functional composition)非常有限。...map3就是函数升阶组合:把函数 (_(_(_))) >>> (a,b,c) => d 在高阶类型结构内进行组合。...通过对两个Applicative进行函数组合后形成一个更高阶的Applicative。这个Applicative和其它普通的Applicative一样可以实现多参数函数的升阶连续施用。

    881100

    编程语言:类型系统的本质

    编程语言中的基本类型 类型组合 OOP与接口类型 函数类型 函子(Functor)和单子(Monad) 1. 概述:什么是类型?为什么要引入类型的概念?...,代表具有另外一个类型参数的类型参数。...例如,T或Box>有一个类型参数T,后者又有一个类型参数U。 正如高阶函数是接受其他函数作为实参的函数,高阶类型是接受其他种类作为实参的种类(参数化的类型构造函数)。...一个“参数化表达式”的面向对象继承体系的例子。类图如下。 这里的表达式,可以通过eval() 方法,计算得到一个数字,二元表达式有两个操作数,加法和乘法表达式通过把操作数相加或相乘来计算结果。...用函数装饰器来实现 下面我们来使用函数类型实现装饰器模式。 首先,删除IWidgetFactory接口,改为使用一个函数类型。

    2.6K31
    领券