Cis*_*one 12 monads state haskell
我正在阅读Real World Haskell中的Monads章节(第14章).函数定义如下:
type RandomState a = State StdGen a
getRandom :: Random a => RandomState a
getRandom =
get >>= \gen ->
let (val, gen')= random gen in
put gen' >>
return val
Run Code Online (Sandbox Code Playgroud)
我真的不明白get和put函数的用途.我重写了以下函数,它似乎做了同样的事情并且更简洁:
getRandom2 :: Random a => RandomState a
getRandom2= State $ \ s -> random s
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:获取和放置一般的目的是什么?
GS *_*ica 12
这有点巧合random恰好与Statemonad 的内部函数具有完全相同的类型签名/使用模式(事实上,在这种情况下,你可能会更简洁,如果可能更令人困惑的话getRandom2 = State random).
然而,更普遍的是将不适用,然后get和put方便水暖件,其意义或许比直接写入内部功能更加清晰.它们还有助于从所使用的精确表示中抽象出来State- 它们实际上是更通用类的类成员MonadState,因此您可以使用它们编写更多的多态代码.