代码之家  ›  专栏  ›  技术社区  ›  CiscoIPPhone

MonadState得到并投入的原因是什么?

  •  12
  • CiscoIPPhone  · 技术社区  · 15 年前

    我在读《现实世界中的蒙娜斯》一章(第14章)。 函数是 defined 如下:

    type RandomState a = State StdGen a
    getRandom :: Random a => RandomState a
    getRandom =
        get >>= \gen ->
        let (val, gen')= random gen in
        put gen' >>
        return val
    

    我不太明白get和put函数的用途。 我将函数重写为以下函数,它似乎执行相同的操作,并且更简洁:

    getRandom2 :: Random a => RandomState a 
    getRandom2= State $ \ s -> random s
    

    所以我的问题是: 一般来说,get和put的目的是什么?

    1 回复  |  直到 15 年前
        1
  •  12
  •   Ganesh Sittampalam    15 年前

    这有点巧合 random 与的内部函数具有完全相同的类型签名/使用模式 State Monad(实际上,在本例中,您可以更简洁,如果可能更混乱的话, getRandom2 = State random )

    但是,一般来说,这不适用,然后 get put 是方便的管道部件,其含义可能比直接编写内部函数更清楚。它们也有助于从 状态 -他们实际上是更普通的班级的成员 MonadState ,这样您就可以通过使用它们来编写更多的多态代码。