【发布时间】:2015-06-02 10:44:53
【问题描述】:
我目前正在设计一种数值算法,作为其操作的一部分,它需要多次更新doubles 的向量。由于算法必须尽可能节省空间和时间,我不想编写传统类型的 FP 代码,因为这种代码在每次操作后都会在后台创建许多版本的数据结构。我也不想创建可变数据结构并使它们全局可用。因此,我决定使用可变数据结构,然后选择在State monad 中执行可变操作。由于这是我第一次尝试使用 State monad,我想确认我是否有
- 保留的引用透明度
- 保持功能纯度
update 函数转换数据结构状态。由于破坏性更新是在这个函数内部进行的,并且无法从外部获取数据结构的句柄,所以我认为这个函数是纯粹的并且是引用透明的。
def update(i : Int,d : Double) = State[ArraySeq[Double], Unit]{
case xs: ArraySeq[Double] => {xs(i) = d; (xs, ())}
}
app 函数是一个玩具函数,它将消耗 doubles 序列并修改其状态:
def app : State[ArraySeq[Double], Unit] = for{
_ <- update(0, 3.142)
// do a heap of stuff on ArraySeq
}yield()
呼叫:
app(Vector(0.0, 1.0, 2.0, 3.0, 4.0).to[ArraySeq])._1.to[Vector]
结果:
res0: Vector[Double] = Vector(3.142, 1.0, 2.0, 3.0, 4.0)
【问题讨论】:
-
你使用的是scalaz的State还是你自己写的?
标签: scala functional-programming