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

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

Applicative 就是某种Functor,因为我们可以用map2来实现map,所以Applicative可以map,就是Functor,叫做Applicative Functor。...我们又说所有Monad都是Applicative,因为我们可以用flatMap来实现map2,但不是所有数据类型的flatMap都可以用map2实现,所以反之不是所有Applicative都是Monad...表面上看来Monad已经覆盖了Functor, Applicative。可能就是因为Monad的功能太强大了,所以Monad的函数组合(functional composition)非常有限。...那么我们就制造一个对任何B的类型:  type Const[A,B] = A 用这个类型加上Monoid实现一个Applicative实例: 1 object Applicative { 2...因为所有Monad都是Applicative,所以等于我们已经获取了State Applicative Functor实例

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

Monad_Haskell笔记10

一.从FunctorMonad类型来看,FunctorApplicative再到Monad是从一般到特殊的递进过程(Monad是特殊的ApplicativeApplicative是特殊的Functor...函数输入输出类型一致的情况 context里的函数 + context里的值:Applicative context里的函数 + 普通值:用pure包一下再调 普通函数 + context里的值:Functor...、ApplicativeMonad已经足够应付所有情况了 二.Monad typeclass class Applicative m => Monad m where (>>=) ::...所以forall a b. m a -> (a -> m b) -> m b是说,对于任意的类型变量ab,>>=函数的类型是m a -> (a -> m b) -> m b。...,>>=是个映射操作,没什么好说的 >>看起来有点意思,等价于定义Applicative上的*>: class Functor f => Applicative f where (*>) :: f

70350

Scalaz(10)- Monad:就是一种函数式编程模式-a design pattern

上面这些类型trait的继承关系是这样的:Monad继承了ApplicativeBind,Applicative继承了Apply, Apply继承了Functor, Bind也继承了Apply。...所以Monad同时又是ApplicativeFunctor,因为Monad实现了mapap函数。一个Monad实例可以调用所有ApplicativeFunctor提供的组件函数。...任何实例只需要实现抽象函数pointbind就可以成为Monad实例,然后就可以使用Monad所有的组件函数了。...下面是Functor,ApplicativeMonad施用函数格式比较: 1 // Functor : map[A,B] (F[A])(f: A => B): F[B] 2 //...而且程序运算行为只会受一种类型的特性所控制。如上面所叙,Monad实例类型控制Monadic程序的运算行为。每一种Monad实例的程序可以有不同的运算方式。

735100

函子定律

最大的感受是,以前对 FunctorApplicative Monad 的理解太片面了。...在范畴论中,函子是范畴间的一态射(这个定义给我的直观感受是函子指的是 fmap 函数……),数学上的概念就不多说了,下面我们来看看 Haskell 中的 Functor。...Haskell 中有一个叫 Functor类型(暂时可以粗略地理解 OO 语言中的接口),它的定义是这样的: class Functor f where fmap :: (a -> b) -...> f a -> f b Functor实例不是一个具体的类型,而是一个类型构造器(暂时理解类似范型的东西),譬如 Int、Maybe Int 都是具体类型,而 Maybe 就是个类型构造器。...所以从 Functor定义来看,似乎只要实现了 fmap 函数的类型构造器,就是函子了。

90020

泛函编程(25)-泛函数据类型MonadApplicative

任何数据类型只要能实现flatMap+unit这组Monad最基本组件函数就可以变成Monad实例,就可以使用Monad组件库像for-comprehension这样特殊的、Monad具备的泛函式数据结构内部的按序计算运行流程...之前我们尝试了List,Option,甚至更复杂的State等数据类型Monad实例,过程中我们分别对这些数据类型的unitflatMap进行了实现。...从前面的讨论我们可以注意到很多数据类型Monad实例的组件函数都可以用map2unit来实现,如: 1 def sequence[A](lma: List[M[A]]): M[List[...所以Applicative extends Functor。下面我们来分析一下flatMapmap2的差别,这也代表着MonadApplicative在行为上的区别。...但是,有些Applicative未必是Monad,因为我们可能无法用某些类型Applicative实例的map2或apply来实现flatMap、join、compose。

1.4K90

FunctorApplicative_Haskell笔记7

functor and box 函数也是Functor实例?! 那么,是不是所有的Functor实例都可以这样理解呢?...所以,别叫盒子了,叫计算语境,fmap相当于对这个计算语境追加一层转换(做映射) Lifting 再看一遍fmap的类型定义: fmap :: Functor f => (a -> b) -> f a...Applicative f => (a -> b -> c -> d) -> f a -> f b -> f c -> f d 更多参数的可以通过秒秒钟定义出来,见下面Applicative...,因为这两条规则只是道德约束,没有强检查,所以在实现自定义Functor实例时应该注意自觉遵守 三.Applicative functors 看名字叫加强版的Functor,那么强在哪里?...a -> f b (摘自Applicative) 要求必须先是Functor实例,所以Applicative是一种特殊的Functor,所以也被称为Applicative functors 定义了两个接口

56030

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

有一个特殊幺元,能够任何元素组合,导致的结果是不改变这些元素。 函子到底是什么? 一个函子Functor是任意类型,这些类型定义了如何应用 map (fmap in Haskell) 。...也就是说,如果我们要将普通函数应用到一个有盒子上下文包裹的值,那么我们首先需要定义一个叫Functor的数据类型,在这个数据类型中需要定义如何使用map或fmap来应用这个普通函数。...Applicative 当我们的值被一个上下文包裹,就像函子Functor: ?...image.png 那么函子、applicativeMonad三个区别是什么? ? image.png functor: 应用一个函数到包裹的值,使用fmap/map....Monads for functional programming Functor, Applicative, Monad ---- 函子functor是比函数更高阶的函数,函子是作用于两个范畴之间的函数

4.1K30

实现TypeScript运行时类型检查

定义.Functor 是范畴论的一个术语, 在这里我们可以简单将其理解"实现了map函数"的interface.进一步地, Parser 同样符合"串行运算"的特质, 为了简洁, 我们这里只给出其类型定义...f (t a)fromStructfromArray一样, 其实现最终导向了这个"奇怪"的类型转换, 接下来我们就深入这个类型签名, 讲讲其背后蕴含的理论.sequenceAApplicative我们再来看这个类型签名...实现.Functor上文提到过, 让我们简单看看Monad.interface Monad extends Applicative{ chain: (fa: F, f: (...Monad.chain:then(f: (a:A) => B): Promise 对应Functor.mapthen(f: (a:A) => Promise): Promise...的类型声明中, Monad还实现了Applicative:interface Applicative extends Functor { of: (a: A) => F;

2.3K30

来看看几种 Monad来看看几种 Monad

在这一章,我们会学到 Monad,基本上他是一种加强版的 Applicative Functor,正如 Applicative FunctorFunctor 的加强版一样。 ?...我们不写成 f a 而写成 m a 是因为 m 代表的是 Monad,但 monad 不过就是支持 >>= 操作的 applicative functors。>>= 我们称呼他 bind。...Monad type class 正如 functors 有 Functor 这个 type class,而 applicative functors 有一个 Applicative 这个 type class...不是应该有一个限制说一个型态必须先是一个 applicative functor 才可能是一个 monad 吗?像是 class (Applicative m) = > Monad m where。...但的确每个 monad 都是 applicative functor,即使 Monad 并没有这么声明。 在 Monad typeclass 中定义的第一个函数是 return。

97620
领券