2017-02-21 1 views
0

私はオブジェクトを持っています。与えられたすべての入力を返す有限状態マシン(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) 
} 

答えて

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を使用して終了できます。

1

再帰を使用します。

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

スタックオーバーフローの問題を避けるには、そのメソッドに '@ tailrec'を付ける必要がありますか? – Atreys

+0

@Atreys、あなたは '@ tailrec'アノテーションの目的/機能を誤解しています。コンパイラが生成するものは変更されません。注釈付きメソッドが末尾再帰型でない場合は、単にコンパイルを停止します。 – jwvh

+0

説明をありがとう – Atreys

関連する問題