如何实现返回状态的write方法

时间:2013-11-28 15:18:09

标签: scala

我有这种非常频繁的代码类型:

def writeOne(s: S, a: A) : S = …
def writeAll(init: S, l: List[A]) = l.foldLeft(init)(writeOne)
def process = {
  val as : List[A] = …
  val init : S = new S()
  writeAll(init, as)
}

在代码设计方面,有没有更好的方法来编写它?

1 个答案:

答案 0 :(得分:1)

您是否愿意使用Scalaz?状态monad可以帮助您封装通过这些操作线程化状态的一些业务:

import scalaz._, Scalaz._

def writeOne(a: A): State[S, Unit] = State.modify(
  s => ??? // Do something with `s` and `a`, returning the new `S`.
)

def writeAll(l: List[A]): State[S, Unit] = l.traverseS_(writeOne)

def process = {
  val as: List[A] = ???
  val init = new S()

  writeAll(as).run(init)
}

我发现你的代码特别冗长或难以阅读,但如果你觉得你写的太多方法需要一些参数s: S并返回一个新的S,州monad是一种清理事物的方法。