各ステップの後に継続のようなものを返す式を作成するビルダーを作成したいと思います。
このようなもの:
module TwoSteps =
let x = stepwise {
let! y = "foo"
printfn "got: %A" y
let! z = y + "bar"
printfn "got: %A" z
return z
}
printfn "two steps"
let a = x()
printfn "something inbetween"
let b = a()
'let a'行は、後で評価される残りの式を含むものを返します。
ステップ数ごとに別々のタイプでこれを行うのは簡単ですが、もちろん特に便利ではありません。
type Stepwise() =
let bnd (v: 'a) rest = fun () -> rest v
let rtn v = fun () -> Some v
member x.Bind(v, rest) =
bnd v rest
member x.Return v = rtn v
let stepwise = Stepwise()
module TwoSteps =
let x = stepwise {
let! y = "foo"
printfn "got: %A" y
let! z = y + "bar"
printfn "got: %A" z
return z
}
printfn "two steps"
let a = x()
printfn "something inbetween"
let b = a()
module ThreeSteps =
let x = stepwise {
let! y = "foo"
printfn "got: %A" y
let! z = y + "bar"
printfn "got: %A" z
let! z' = z + "third"
printfn "got: %A" z'
return z
}
printfn "three steps"
let a = x()
printfn "something inbetween"
let b = a()
printfn "something inbetween"
let c = b()
そして、結果は私が探しているものです:
two steps
got: "foo"
something inbetween
got: "foobar"
three steps
got: "foo"
something inbetween
got: "foobar"
something inbetween
got: "foobarthird"
しかし、私はこれの一般的なケースがどうなるかを理解することはできません。
私が欲しいのは、このワークフローにイベントをフィードできるようにすることです。そうすれば、次のように書くことができます。
let someHandler = Stepwise<someMergedEventStream>() {
let! touchLocation = swallowEverythingUntilYouGetATouch()
startSomeSound()
let! nextTouchLocation = swallowEverythingUntilYouGetATouch()
stopSomeSound()
}
そして、イベントがワークフローの次のステップへの移動をトリガーするようにします。(特に、私はこの種のことをMonoTouchで遊んでみたいと思っています-iPhoneのF#。objcセレクターを回すと私は狂気になります。)