gpt4 book ai didi

asynchronous - F#:相当于 OCaml 异步

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

F# 是否与 OCaml 的 Async 库等效?具体来说,是否能够轻松地生成延迟值并在填充时执行函数?

特别是,我想等到某个特定的引用发生变化,然后再做一些事情。在 OCaml 中,我会通过创建一个 ivar 并调用它的读取函数来做到这一点;我怎么能在 F# 中做到这一点?

最佳答案

简短的回答

是的,我的 Hopac库是 Jane Street 的 Async 库和 asynchronous workflows 的近亲。 F# 等等。 Hopac 基于 Concurrent ML (CML)并且可以说(作为技术术语而不是意见)目前提供了比其中任何一个都更具表现力的编程模型。

更长的答案

Jane Street 的 Async 的 Deferred很像.Net的Task .两者本质上都是comonadic具有写在顶部的单子(monad)层的抽象。

在 Hopac 中,与 Deferred 最接近的实际上是 Promise .然而,Hopac 并没有直接为 Promises 提供一元层。当然,你可以很容易地写一个,但我建议你先坐一会儿。相反,Hopac 提供 Job monad 用于编码轻量级线程。这类似于 how F#'s asynchronous workflows are defined感觉更自然easier to reason about在我的主观意见中。

Jane Street 的 Async 的 Ivar是 Hopac 的 IVar 的近亲.两者都来自同一血统。

使 CML 和 Hopac 比 Jane Street 的 Async 和 F# 的异步工作流更具表现力的是同步事件 (CML) 或 alternatives 组合器的可用性。 (霍帕克)。使用这多种并发协议(protocol)可以封装为一流的、可扩展的(高阶)选择性操作。

CML 和 Hopac 同步 channels支持简单的会合,这意味着通信的两端在通信发生时达成一致。反过来,这有一些有趣的应用,例如实现 Multicast channels 的能力。支持垃圾回收发布-订阅式通信,无需显式取消订阅(对比 Rx IObservable - IObserver)。

具体答案

这是一个 F# 交互式 session ,它首先定义一个 IVar,然后启动一个并发作业,该作业读取 IVar 的值并打印一条消息。最后,IVar 被写入一个值:

> let nameVar : IVar<string> = ivar () ;;
val nameVar : IVar<string>
> start (nameVar |>> fun who -> printfn "Hello, %s!" who) ;;
val it : unit = ()
> run (nameVar <-= "Vesa") ;;
val it : unit = ()
> Hello, Vesa!

为了产生这个输出,F# interactive 使用 Hopac.fsx 启动。脚本。

关于asynchronous - F#:相当于 OCaml 异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24945589/

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