gpt4 book ai didi

haskell - 简单发电机

转载 作者:行者123 更新时间:2023-12-04 18:11:29 26 4
gpt4 key购买 nike

此代码来自名为"Lazy v. Yield"的论文。它是一种分离数据流的生产者和使用者的方法。我了解代码的Haskell部分,但O'Caml/F#令我难以理解。由于以下原因,我无法理解此代码:

我可以从以异常作为参数并返回单位的函数中期望什么样的行为?

消费者如何将其投影为特定的异常(exception)? (这意味着什么?)

消费者的例子是什么?

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

最佳答案

我对这篇论文不熟悉,所以其他人可能会更有启发性。同时,这里有一些快速解答/猜测。
exn -> unit类型的函数基本上是一个异常处理程序。

异常可以包含数据。它们与多态变体非常相似-也就是说,您可以随时添加新异常,并且它可以充当数据构造函数。

消费者似乎正在寻找可以为其提供所需数据的特定异常。其他人只会重新加注。因此,它只是在寻找可能的异常空间的投影(我想)。

关于haskell - 简单发电机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13146128/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com