Monad State in Haskell 笔记

(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的状态函数中,实现了传递


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

转载于:https://my.oschina.net/kylidboy/blog/669358

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值