【发布时间】:2014-12-08 22:43:16
【问题描述】:
我想以一种函数式的方式来表示一个自修改函数,这让我想到了 state monad。 “Scala 中的函数式编程”一书中的版本本质上是函数 S => (R,S) 的案例类包装器,其中 S 是状态,R 是结果。例如,它与这个随机数生成器一起工作如下:
trait RNG {
def nextInt : Int
}
case State[S,R]( run : S => (R,S) ) { /* other details omitted */ }
type Rand[R] = State[RNG,R] // `random generator of R'
所以这一切都很好,因为我们不需要除 RNG(“状态”部分)以外的参数来返回 R(“结果”部分)。
对于自修改函数,希望使用 state monad 来提出以下语法糖化程度更高的版本:
trait Fn[A,R] {
def apply(a: A): (R,Fn[A,R])
}
最好使用map 和flatMap 方法来完成(然后可以通过Scala 的for 表示法自动加糖)。
但是,与 Rand 示例不同,Fn 采用 A 类型的参数。
这种事情仍然可以使用 state monad 来表示吗? 如果不是,它仍然可以表示为 monand,如果可以,如何写 map 或 flatMap 中的哪一个被认为是基本的*?
*我提到最后一点是因为 FPiS monad trait 似乎将 map 视为基本操作。
【问题讨论】:
标签: scala functional-programming state-monad