与持续可变的对象进行交互

时间:2017-02-21 21:44:48

标签: scala

我有一个对象,我们称之为有限状态机(FSM),它返回给定的每个输入,一个更新的自身克隆。

case class FSM(...){
  def runInput(q:String):(FSM, String) = ...
}

如何以惯用的方式连续从键盘输入输入?

var fsm = FSM('...')

while(true) {
  val i = scala.io.StdIn.readLine()
  val res = fsm.runInput(i)
  fsm = res._1
  println(res._2)
}

2 个答案:

答案 0 :(得分:1)

使用递归。

def doWork(fsm: FSM): FSM = {
  val i = scala.io.StdIn.readLine()
  val (newFsm, result) = fsm.runInput(i)
  println(result)
  doWork(newFSM)
}

答案 1 :(得分:1)

Ryan的回答很好。对于奖励积分,您可以使用适当的抽象替换显式递归。在这种情况下,Iterator.iterate是将函数应用于其先前结果的抽象。

这样的东西
def cycle(fsm: FSM) = {
    val newInput = scala.io.StdIn.readLine()
    val (next, result) = fsm.runInput(newInput)
    println(result)
    next
}

Iterator.iterate(initialFSM)(cycle)

给你一个无限的序列。当然,它很懒,所以你必须做一些事情来强迫它进行计算。要求size工作。

如果您的FSM具有可识别的停止状态,则可以在到达时使用takeWhile终止。