【问题标题】:F#: Equivalent to OCaml AsyncF#:相当于 OCaml 异步
【发布时间】:2014-07-24 23:21:14
【问题描述】:

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

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

【问题讨论】:

  • Asynchronous Workflows 是 F# 的一大卖点。我不能说你可以直接翻译,但你几乎肯定会找到类似的东西。
  • 听起来你在问System.Lazy(另见the lazy keyword)。
  • @ildjarn 嗯。我不知道。这在我看来就像“这是一件事,在我准备好之前不要评估它”;我想要“开始这件事,告诉我什么时候准备好。”
  • 请通过链接或代码示例进行说明,以便我们学习或提供帮助。
  • @linkhyrule5 :那就是Task<T>。另请参阅 Async.AwaitTaskAsync.StartAsTaskAsync.StartChildAsTask

标签: asynchronous f# ocaml


【解决方案1】:

简答

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

更长的答案

Jane Street 的 Async 的 Deferred 很像 .Net 的 Task。两者本质上都是comonadic 抽象,上面写有一个单子层。

在 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 (Hopac) 的组合器的可用性。使用这多种并发协议可以封装为一流的、可扩展的(高阶)选择性操作。

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

具体回答

这是一个 F# 交互式会话,它首先定义一个 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!

为了生成此输出,使用 Hopac.fsx 脚本启动了 F# 交互。

【讨论】:

    【解决方案2】:

    F# 是否具有与 OCaml 的 Async 库等效的功能?

    F# 内置了async 以及更多,例如MailboxProcessor

    具体来说,是否能够轻松地生成延迟值并在填充时执行函数?

    .NET 提供了 Task,它可以做到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多