如何以惯用的Scala / FP方式存储请求队列

时间:2015-09-09 17:43:07

标签: scala functional-programming

正如标题所说,我正在尝试将一些命令存储在我正在编写的程序中(代码生成器),只是为了在稍后阶段解释它们。

这主要是因为某些命令需要来自其他人的信息,而且我认为不会对命令发送者强制执行非常严格的命令会更好(尽管这种选择也有使其变得更难的缺点)决定命令是否为vadid)。

问题是一个非常简单的问题:在Scala中,除了Buffer之外,我无法想到任何其他集合来表示此命令队列。在我的情况下不需要并发,并且使用一次更新一个元素的不可变集合感觉很愚蠢。

另一方面,我希望尽可能地减少程序中的可变性 - 这是一个可以合理完成的地方吗?或者我的直觉是正确的,缓冲区是我自然适合的情况..

这是一个草图,说明如果使用不可变集合,这个商店会是什么样子。 (终止命令会说我们已经完成了给定符号的更新,然后可以通过将其唯一的BuildCommand与零个或多个UpdateCommands一起解释来构造)

trait Outcome
sealed trait Command {
  def symId : String
}
sealed trait ChangeCommand extends Command
sealed trait BuildCommand extends Command
sealed trait UpdateCommand extends Command
final case class TerminationCommand(symId: String) extends Command

var comQueue = immutable.Seq[ChangeCommand]()

private def translate(sId : String) : Outcome = {
  val forSymb = comQueue filter {_.symId}
  //...
}

def interpret(c : Command) = c match {
  case cc : ChangeCommand    => 
    comQueue = comQueue + cc
    None
  case TerminationCommand(s) =>
    Some(translate(s))
}

1 个答案:

答案 0 :(得分:0)

如果你只追加操作然后顺序访问它们,我想不出比不可变列表更合适。只需使用Seq()即可。