これが私がこれまでに持っているものです:
type Maybe<'a> = option<'a>
let succeed x = Some(x)
let fail = None
let bind rest p =
match p with
| None -> fail
| Some r -> rest r
let rec whileLoop cond body =
if cond() then
match body() with
| Some() ->
whileLoop cond body
| None ->
fail
else
succeed()
let forLoop (xs : 'T seq) f =
using (xs.GetEnumerator()) (fun it ->
whileLoop
(fun () -> it.MoveNext())
(fun () -> it.Current |> f)
)
whileLoop
ループをサポートするために正常に動作しfor
ますが、whileループがサポートされるようにする方法がわかりません。問題の一部は、whileループの変換でが使用delay
されることですが、この場合は理解できませんでした。以下の明らかな実装は、計算を遅らせることはなく、代わりに実行するため、おそらく間違っています。
let delay f = f()
遅延がないことも妨げtry...with
になりtry...finally
ます。