【发布时间】:2012-10-30 19:16:16
【问题描述】:
此代码来自一篇名为"Lazy v. 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
【问题讨论】:
-
好的,所以例子可以在论文链接的repo中找到。
标签: haskell f# ocaml yield iterate