6、纯函数式状态编程:从随机数生成到通用状态处理

纯函数式状态编程:从随机数生成到通用状态处理

1. 副作用随机数生成的问题

在 Scala 中,标准库的 scala.util.Random 类可用于生成随机数,但其使用了副作用的方式。例如:

scala> val rng = new scala.util.Random
scala> rng.nextDouble
val res1: Double = 0.9867076608154569
scala> rng.nextDouble
val res2: Double = 0.8455696498024141
scala> rng.nextInt
val res3: Int = -623297295
scala> rng.nextInt(10)
val res4: Int = 4

由于每次调用方法时对象的内部状态会更新,这些方法不具有引用透明性,导致测试性、可组合性、模块化和并行性较差。以模拟掷骰子的方法为例:

def rollDie: Int =
  val rng = new scala.util.Random
  rng.nextInt(6)

此方法存在偏移错误,本应返回 1 到 6 之间的值,实际返回 0 到 5 之间的值。而且测试时,六分之五的情况下能通过,若测试失败也难以可靠重现。即使传入随机数生成器,也因难以保证其状态相同而无法解决问题。因此,应避免使用副作用。

2. 纯函数式随机数生成
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值