プログラミングF#の状態ワークフローについてメモ
プログラミングF#のp.268に状態ワークフロー(Stateモナド)を展開した次のような擬似コードがあります。
StatefulFunc(fun initialState ->let
result1, updatedState1 = OpenWebPage "www.bing.com" initialStateupdatedState1 |> (fun initialState ->
let result2, updatedState2 = EnterText "Jellyfish" initialStateupdatedState2 |> (fun initialState ->
let result3, updatedState3 = ClickButton "Search" initialStateresult3, updatedState3
))
)
しかし、p.269のBindの定義とどうも合致しない。Bindメソッドの定義はこんな風です。
member this.Bind(result:StatefulFunc<'state, 'a>, restOfComputation:'a -> StatefulFunc<'state, 'b>) =
StatefulFunc(fun initialState ->
let result, updatedState = Run result initialState
Run (restOfComputation result) updatedState )
著者の目的は概略を示すことなので合致していないからといって間違っているわけでもないですが、restOfComputationをresultに適用する処理(「resultを受け入れる関数」にresultを渡すと「stateを受け入れる関数」を返してくれる処理)が入っていないと思うんですよね。それを入れるとこうなるんじゃないでしょうか。
StatefulFunc(fun initialState ->これでBindメソッドの定義と合うはず。let
result1, updatedState1 = OpenWebPage "www.bing.com" initialStateupdatedState1 |> (result1 |> (fun result -> (fun initialState ->
let result2, updatedState2 = EnterText "Jellyfish" initialStateupdatedState2 |> (result2 |> (fun result -> (fun initialState ->
let result3, updatedState3 = ClickButton "Search" initialStateresult3, updatedState3
))))))
)