このコードは、 「Lazyv.Yield」という論文に基づいています。データストリームのプロデューサーとコンシューマーを切り離す方法についてです。コードのHaskellの部分は理解していますが、O'Caml / F#ではわかりません。次の理由でこのコードを理解していません。
引数として例外を取り、単位を返す関数にはどのような動作が期待できますか?
消費者はどのように特定の例外に投影しますか?(どういう意味ですか?)
消費者の例は何でしょうか?
module SimpleGenerators
type 'a gen = unit -> 'a
type producer = unit gen
type consumer = exn -> unit (* consumer will project into specific exception *)
type 'a transducer = 'a gen -> 'a gen
let yield_handler : (exn -> unit) ref =
ref (fun _ -> failwith "yield handler is not set")
let iterate (gen : producer) (consumer : consumer) : unit =
let oldh = !yield_handler in
let rec newh x =
try
yield_handler := oldh
consumer x
yield_handler := newh
with e -> yield_handler := newh; raise e
in
try
yield_handler := newh
let r = gen () in
yield_handler := oldh
r
with e -> yield_handler := oldh; raise e