文档章节

Monad State in Haskell 笔记

Kyli
 Kyli
发布于 2016/05/04 00:30
字数 355
阅读 47
收藏 0
(Monad m) => m a >> m b = m a >>= \_ -> m b

每次都会被>>是简版的>>=,这一点迷惑

其实心中要记住的是,说是简版,只能说是逻辑上忽略>>左边的action的值,而直接bind后面的monad,与其说是简版,还不如说是wrap版的,因为最后拆开里面还是一个>>=........

所以当一些Monad的实例,定义了复杂的>>=,那么>>的逻辑会远比用 do 语法糖的时候,来的复杂,

State就是如此,

每次看到rollDie的定义的时候,都会怀疑为什么state会被传递,一眼真的开不出来:

import Controll.Monad.Trans.State
import System.Random
type DiceState = State StdGen
rollDie :: DiceState Int
rollDie = do
        gen <- get
        let (value, gen') = randomR(1, 6) gen
        put gen'
        return value

如果改写成bind的话,

get >>= \gen -> 
    let (val, gen') = randomR(1, 6) gen 
    in put gen' >> return val

那么,再把最后一句的>>打开

put gen' >>= \_ -> return val

再套用State的>>=的定义:

state $ \st ->
    let (xxx, st') = runState (put gen') st 
    in runState ((\_ -> return val) xxx) st'

可以看到,put gen'产生的state $ \st -> ((), st),由此获得的xxx会被 "\_" 忽略(本身就是空()),然后

runState ((\_ -> return val) xxx)

得到

\st'' -> (val, st'')

这样状态st'就被打包在最终生成的State的状态函数中,实现了传递


说实在的,自己也看不懂了,哇哈哈哈哈哈哈

© 著作权归作者所有

Kyli
粉丝 4
博文 25
码字总数 4526
作品 0
高级程序员
私信 提问
Haskell学习-monad

原文地址:Haskell学习-monad 什么是Monad Haskell是一门纯函数式的语言,纯函数的优点是安全可靠。函数输出完全取决于输入,不存在任何隐式依赖,它的存在如同数学公式般完美无缺。可是纯函...

Jeff.Zhong
2018/08/17
0
0
Promise是Monad吗?

译者按: 近年来,函数式语言的特性都被其它语言学过去了。 原文: Functional Computational Thinking — What is a monad? 译者: Fundebug 为了保证可读性,本文采用意译而非直译。另外,本...

Fundebug
2017/06/27
0
0
Typescript版图解Functor , Applicative 和 Monad

本文是经典的Functors, Applicatives, And Monads In Pictures的Typescript翻译版本。 Functor/Applicative/Monad是函数式编程中的一些比较‘基础’的概念,反正我是不认同‘基础’这个说法的...

_sx_
08/25
0
0
Promise是Monad吗?

译者按: 近年来,函数式语言的特性都被其它语言学过去了。 原文: Functional Computational Thinking — What is a monad? 译者: Fundebug 为了保证可读性,本文采用意译而非直译。另外,本...

Fundebug
2017/06/21
12
0
完整解释 Monad -- 程序员范畴论入门

如果你接触过函数式编程,你很可能遇到过 Monad 这个奇怪的名词。由于各种神奇的原因,Monad 成了一个很难懂的概念。Douglas Crockford 曾转述过这样一句话来形容 Monad: Once you understa...

serialcoder
01/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

崛起于Springboot2.X之5分钟解决单点登陆(53)

SpringBoot2.X心法总纲 1、pom文件依赖 <dependency> <groupId>com.majiaxueyuan</groupId> <artifactId>sso-core</artifactId> <version>1.2.2</version></dependency> 2、......

木九天
33分钟前
16
0
面向对象和面向过程的区别

面向过程 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。 缺点:没有面向对...

无名氏的程序员
35分钟前
13
0
OpenStack大事记

2010年7月19日,Rackspace、NASA、Citrix、Dell共同开发并发布OpenStack第一个版本。 2011年10月,Rackspace放弃OpenStack控制权,交由一新成立的OpenStack基金会管理。 2012年5月NASA宣布退...

大别阿郎
35分钟前
10
0
面向对象的简单应用—以交通工具(Vehicle)为列

请定义一个交通工具(Vehicle)的类其中有: 属性: 速度(speed)、 体积(size)等,方法:移动(move())、设置速度(setSpeed(int speed))、加速 speedUp()、减速 speedDown()等。最后在测试类 Ve...

INEVITABLE
46分钟前
9
0
通往艺术家之路

通往艺术家之路 并发编程中,开发者往往需要权衡锁的颗粒粗细,锁住的代码块太大呢会导致可能的线程堵塞,锁的颗粒太细呢又会因为频繁地加锁解锁导致系统用户态内核态的转换从而消费很多时间...

StupidZhe
47分钟前
26
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部