我有一个对象,我们称之为有限状态机(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)
}
答案 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)
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
终止。