プログラミングF#の状態ワークフローについてメモ

プログラミングF#のp.268に状態ワークフロー(Stateモナド)を展開した次のような擬似コードがあります。

StatefulFunc(fun initialState ->

let result1, updatedState1 = OpenWebPage "www.bing.com" initialState

updatedState1 |> (fun initialState ->
let
result2, updatedState2 = EnterText "Jellyfish" initialState

updatedState2 |> (fun initialState ->
let
result3, updatedState3 = ClickButton "Search" initialState

result3, 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 ->

let result1, updatedState1 = OpenWebPage "www.bing.com" initialState

updatedState1 |> (result1 |> (fun result -> (fun initialState ->
let
result2, updatedState2 = EnterText "Jellyfish" initialState

updatedState2 |> (result2 |> (fun result -> (fun initialState ->
let
result3, updatedState3 = ClickButton "Search" initialState

result3, updatedState3
)))

)))

)

これでBindメソッドの定義と合うはず。