lin*_*le5 5 f# ocaml asynchronous
F#是否与OCaml的异步库等效?具体来说,是否能够在填充时轻松创建延迟值并执行函数?
特别是,我想等到特定的引用发生变化,然后再做一些事情.在OCaml中,我通过制作一个ivar并调用它的读取功能来做到这一点; 我怎么能在F#中做到这一点?
小智 15
是的,我的Hopac库是Jane Street的Async库和F#的异步工作流程的近亲.Hopac基于Concurrent ML(CML),并且可以说(在技术术语而不是意见问题上)目前提供了比其中任何一种更具表现力的编程模型.
Jane Street的Async 延迟很像.Net的任务.两者基本上是共同的抽象,顶部写着monadic层.
在Hopac中,与Deferred最相关的实际上是Promise.但是,Hopac不直接为Promises提供monadic层.当然,你可以很容易地写一个,但我建议你坐一会儿.相反,Hopac提供了Job monad来编码轻量级线程.这类似于F#的异步工作流程的定义方式,并且在我的主观意见中感觉更自然,更容易推理.
Jane Street的Async的Ivar是Hopac的IVar的近亲.两者都来自同一血统.
使CML和Hopac比Jane Street的Async和F#的异步工作流更具表现力的是同步事件(CML)或备选方案(Hopac)的组合器的可用性.使用那些多种并发协议可以封装为一流的,可扩展的(高阶),选择性操作.
CML和Hopac的同步通道支持简单的会合,这意味着通信的两端在通信发生时都是一致的.反过来,这有一些有趣的应用程序,例如能够实现支持垃圾收集发布 - 订阅样式通信的多播通道,而无需显式取消订阅(与Rx IObservable - IObserver相比).
这是一个F#交互式会话,首先定义一个IVar,然后启动一个并发Job,它读取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!
Run Code Online (Sandbox Code Playgroud)
要生成此输出,使用Hopac.fsx脚本启动F#interactive .