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

Haskell中State的Functor/Applicative实例

在Haskell中,State是一种用于处理状态的数据类型。它允许我们在函数式编程中模拟可变状态,并且能够保持纯函数的特性。State类型的定义如下:

代码语言:haskell
复制
newtype State s a = State { runState :: s -> (a, s) }

其中,s表示状态的类型,a表示计算结果的类型。State类型的值可以看作是一个接受状态作为输入,并返回计算结果和新状态的函数。

State的Functor实例允许我们对State中的计算结果进行映射。具体而言,它将一个函数应用于State中的计算结果,然后返回新的State。Functor实例的定义如下:

代码语言:haskell
复制
instance Functor (State s) where
    fmap f (State g) = State $ \s -> let (a, s') = g s in (f a, s')

这里,fmap接受一个函数f和一个State计算g,它首先运行g获取计算结果和新状态,然后将f应用于计算结果,最后返回新的State。

State的Applicative实例允许我们在State计算中应用带有状态的函数。具体而言,它将一个带有状态的函数应用于State中的计算结果,然后返回新的State。Applicative实例的定义如下:

代码语言:haskell
复制
instance Applicative (State s) where
    pure a = State $ \s -> (a, s)
    (State f) <*> (State g) = State $ \s -> let (h, s') = f s
                                                (a, s'') = g s'
                                            in (h a, s'')

这里,pure接受一个值a并返回一个将该值包装在State中的计算。<*>接受两个State计算f和g,它首先运行f获取一个带有状态的函数h和新状态,然后运行g获取计算结果和新状态,最后将h应用于计算结果,返回新的State。

State的优势在于它提供了一种纯函数式的方式来处理状态。通过使用State,我们可以将状态的变化封装在函数中,避免了副作用和可变状态对程序的影响。这使得代码更加可靠、可维护,并且易于测试和推理。

State的应用场景包括但不限于状态机、解析器、编译器等需要处理状态的领域。在这些场景中,State可以帮助我们管理和更新状态,使得代码更加清晰和模块化。

腾讯云提供了一系列与云计算相关的产品,但在这里不提及具体品牌商。你可以通过访问腾讯云的官方网站来了解更多关于云计算的信息和相关产品。

参考链接:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

FunctorApplicative_Haskell笔记7

Functor ((,) a) -- Defined in ‘GHC.Base’ (注意:简单起见,上面列出只是一般Functor实例,去掉了3个同样属于Applicative特殊Functor实例...Functor实例时应该注意自觉遵守 三.Applicative functors 看名字叫加强版Functor,那么强在哪里?...value 这正是我们想要,把一个Functor函数作用于另一个Functor值 所以,ApplicativeFunctor增强体现在函数上,增强方式是让这些Functor实例都实现个...context就是Just something,从Nothing取不出函数,所以结果一定是Nothing,如果左侧不是Nothing,就模式匹配从中取出函数f,并通过fmap作用于右侧Maybe实例...差异) 参考资料 Lifting What is “lifting” in Haskell?

56130

Applicative 函子

Applicative 定律 Application 函子是一种加强函子,在 Haskell Control.Applicative 模块定义了一个 Applicative 类型类: class...同普通函子一样,一个类型构造器要成为 Applicative 实例的话,它 kind 必须是* -> *,即接受一个参数,返回一个具体类型。...要成为 Applicative 类型类实例,还必须定义两个函数,pure 和 。...至于的话,先考虑函数作为普通函子情况,我们知道函子值是一个包涵上下文值,当函数作为函子值时,从这个上下文中取值操作就是将一个参数传递给该函数,然后产生一个值,所以函数作为Functor类型类实例时是这样...那也同理,它接收两个函子值,返回一个函子值,当函数作为函子值时,要先分别取出 f 值(函数)和 g 值,分别将一个参数 x 传递给它们,再将 g x 作为参数传递给 f x(由于 Haskell

71410

函子定律

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

90020

Monad_Haskell笔记10

一.从Functor到Monad 从类型来看,FunctorApplicative再到Monad是从一般到特殊递进过程(Monad是特殊ApplicativeApplicative是特殊Functor...P.S.关于computation context详细信息,见FunctorApplicative_Haskell笔记7 用来解决context相关计算另一个场景:怎样把一个具有context函数应用到具有...换言之,Monad就是支持>>=操作Applicative functor而已 return是pure别名,所以仍然是接受一个普通值并把它放进一个最小context(把普通值包进一个Monad里面...,>>=是个映射操作,没什么好说 >>看起来有点意思,等价于定义在Applicative*>: class Functor f => Applicative f where (*>) :: f...因为applicative functor并不允许applicative value之间有弹性交互 这,怎么理解?

70450

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

Applicative 就是某种Functor,因为我们可以用map2来实现map,所以Applicative可以map,就是Functor,叫做Applicative Functor。...也就是说把traverse需要Applicative Functor降至Id Functor后traverse相当于map操作。...State能够很巧妙地对高阶数据类型结构内部元素进行函数施用同时又维护了运算状态数据。前面我们已经取得了State Nonad实例。...因为所有Monad都是Applicative,所以等于我们已经获取了State Applicative Functor实例。...如果我们在游览(traverse)一个集合过程中用State Applicative Functor对集合元素进行操作并且维护状态数据,那么将会实现强大高阶数据类型处理功能。

840100

newtype_Haskell笔记8

一.ZipList与List 在List场景,xs ys表示从左侧xs取出函数作用于右侧ys每一项,有两种实现方式: 笛卡尔积 拉链式一一结对 分别对应[]和ZipList,例如: import...对而言,这两种实现都是可取,但[]无法同时拥有两种不同Applicative实现,所以造出了ZipList,让它以拉链结对方式实现Applicative P.S.这里提到Applicative...类定义行为,具体见FunctorApplicative_Haskell笔记7 二.newtype ZipList就是因这个场景而产生,本质上是对List包装,定义如下: newtype ZipList...不像type创建别名类型可以与原类型等价换用,newtype创建新类型与原类型是完全不同东西,唯一联系是新类型内部实际操作是原类型(通过持有原类型实例引用),通过这种方式在外层实现对原类型扩展...(typeclass)实现时 四.newtype与惰性计算 Haskell中大多数计算都是惰性(少数指的是foldl'、Data.ByteString之类严格版本),也就是说,计算只在不得不算时候才会发生

59430

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

image.png fmap输入参数是a->b函数,在我们这个案例是(+3),然后定义一个函子Functor,这里是HaskellJust 2,最后返回一个新函子,在我们案例,使用Haskell...Applicative 当我们值被一个上下文包裹,就像函子Functor: ?...image.png 之前我们讨论是如何将一个普通函数应用到这个函子,现在如果这个普通函数也是一个被上下文包裹:就叫 Applicative。...image.png 那么函子、applicative和Monad三个区别是什么? ? image.png functor: 应用一个函数到包裹值,使用fmap/map....I've ever read 我所理解monad Monads for functional programming Functor, Applicative, Monad ---- 函子functor

4.1K30

Scalaz(9)- typeclass:checking instance abiding the laws

在前几篇关于Functor和Applilcative typeclass讨论我们自定义了一个类型Configure,Configure类型定义是这样: 1 case class Configure...和Applicative隐式实例(implicit instance),我们希望Configure类型既是一个Functor也是一个Applicative。...我们只要证明Configure类型实例能遵循它所代表typeclass操作定律就行了。Scalaz为大部分typeclass提供了测试程序(scalacheck properties)。...我们在下面试着对那个Configure类型进行Functor实例Applicative实例测试: 1 import scalaz._ 2 import Scalaz._ 3 import shapeless...外还必须定义Configure类型Equal实例以及任意测试数据产生器(test data generator)configArbi[A]。

48660

泛函编程(27)-泛函编程模式-Monad Transformer

同样,泛函数据类型Foldable,Monoid,Functor,Applicative,Traversable,Monad也是我们将来进入实际泛函编程必需。...在前面对这些数据类型探讨我们发现: 1、Monoid主要用途是在进行折叠(Foldable)算法时对可折叠结构内元素进行函数施用(function application)、 2、Functor可以对任何高阶数据类型...F[_]内元素进行普通函数(A => B)施用(map) 3、Applicative extends Functor,同样都是对F[_}内元素进行函数施用。...Monad extends Applicative,这样,Monad就包含了Functor, Applicative属性。更重要是,Monad成就了for-comprehension。...有了这个Functor实例,我们就可以处理F[G[A]]这样类型数据类型: 1 val listFunctor = new Functor[List] { 2 override def

1.2K70

实现TypeScript运行时类型检查

Parser返回值.这个类型转换具有通用性, 是函数式编程一个重要抽象, 在本节中会化一些篇幅对其推导, 最终将改抽象对应到Haskell sequenceA函数.为了Either[...(t a)这段类型签名Applicative f =>是Haskell 类型约束, 在余下篇幅中会对其重点讲解, 可以暂时对其忽略.即, Haskell 已经有我们所需要类型转行抽象, 函数名为...Monad.chainMonad相比于Functor, 拥有更加"强大"能力:对两个嵌套上下文进行合并, 即Promise> => Promise转换在Monad类型声明..., Monad还实现了Applicative:interface Applicative extends Functor { of: (a: A) => F; ap:...Functor, Monad, Applicative这样类型构造器类型约束称为type class, 而Promise这样实现了某种type class类型称为instance of type

2.3K30

Scalaz(11)- Monad:你存在意义

Scalaz通过Functor, Applicative, Monad提供了三种基本函数施用方式,它们都是针对F[T]里T值: 1 // Functor : map[T,U] (F[T...比如Functor, Applicative, Monad都代表不同编程方式或者说它们都具备不同程序运算模式。特质是指不同数据类型所定义typeclass实例控制着程序具体运算行为。...如Option Monad可以None状态中途终止运算、State Monad确保状态值一直随着程序运算。它们都因为基于不同类型实例而表现不同运算行为。...Functor, Applicative, Monad特质则由它们实例map, ap, flatMap这三个驱动函数具体实现方式所决定。...我们应该没什么需要去获取FunctorApplicative实例,而且Monad trait也继承了FunctorApplicative trait,因为map和ap都可以用flatMap来实现:

85980

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

而不同类型Monad实例则会支持不同程序运算行为,如:Option Monad在运算如果遇到None值则会中途退出;State Monad会确保状态值会伴随着程序运行流程直到终结;List Monad...上面这些类型trait继承关系是这样:Monad继承了Applicative和Bind,Applicative继承了Apply, Apply继承了Functor, Bind也继承了Apply。...所以Monad同时又是ApplicativeFunctor,因为Monad实现了map和ap函数。一个Monad实例可以调用所有ApplicativeFunctor提供组件函数。...下面是Functor,Applicative和Monad施用函数格式比较: 1 // Functor : map[A,B] (F[A])(f: A => B): F[B] 2 //...这是因为Applicative是在既有的容器运算,而flatMap则会重新创建新容器(在Monad世界里容器即为算法(computation)。

736100
领券