Haskell 中 Monad 的深入探讨与应用
1. 随机数生成与 State Monad
在 Haskell 中,随机数生成是一个常见的需求,但传统的随机数生成方式存在一些问题。 random 函数使用隐式范围,而 getStdGen 函数从 IO 单子中获取全局标准数生成器的当前值。然而,正确传递和使用生成器的连续版本会使代码难以阅读。
例如,下面是一个简单的生成两个随机数的函数:
-- file: ch14/Random.hs
twoGoodRandoms :: RandomGen g => g -> ((Int, Int), g)
twoGoodRandoms gen = let (a, gen') = random gen
(b, gen'') = random gen'
in ((a, b), gen'')
为了简化这个过程,我们可以使用 State 单子来隐藏生成器。 State 单子允许我们整齐地管理可变状态,同时保证代码没有其他意外的副作用。
首先,我们定义一个类型同义词:
-- file: ch14/Random.hs
type RandomState a = State StdGen a
<
超级会员免费看
订阅专栏 解锁全文

1883

被折叠的 条评论
为什么被折叠?



