Monad State in Haskellノート


(Monad m) => m a >> m b = m a >>= \_ -> m b
毎回>>が簡版な>>=、ということに惑わされます
実は心の中で覚えなければならないのは、简版というより、论理的に無視するしかない>>左のactionの値、直接bindの后のmonad、简版というよりwrap版で、最后に中を分解するのはまだ1つの>>=......
だからいくつかの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の状態関数にパッケージ化され,伝達が実現される.
本当のことを言うと、自分でも分からないので、ワハハハハハハ