F#でズンドコした
今更感あるけどF#でズンドコした。
type Zundoko = Zun | Doko (* F# 4.0より前のバージョンの場合 let rand = new System.Random () *) let rand = System.Random () let randomZunDoko () = if rand.Next(2) = 0 then printfn "ズン"; Zun else printfn "ドコ"; Doko (* 一つの関数が一つの状態を表す。関数を呼び出すとその関数の状態に遷移する *) let rec state1:(Zundoko -> unit) = function | Zun -> state2 <| randomZunDoko () (* "ズン"なら状態2へ *) | Doko -> state1 <| randomZunDoko () (* "ドコ"なら再び状態1へ *) and state2 = function | Zun -> state3 <| randomZunDoko () | Doko -> state1 <| randomZunDoko () and state3 = function | Zun -> state4 <| randomZunDoko () | Doko -> state1 <| randomZunDoko () and state4 = function | Zun -> state5 <| randomZunDoko () | Doko -> state1 <| randomZunDoko () and state5 = function | Zun -> state5 <| randomZunDoko () | Doko -> printfn "キ・ヨ・シ!" randomZunDoko () |> state1
状態遷移はズンドコキヨシ with DFA(決定性有限オートマトン) - Qiitaを参考にしました。
F#っぽくするなら、ズンドコはシーケンス式で生成してSeq.windowedを使うのだろうけど出力がややこしそうなのでこんな感じにした。