komorebikoboshiのブログ

プログラミング記事(趣味レベル)が多め。

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を使うのだろうけど出力がややこしそうなのでこんな感じにした。