F#上的协程产生一个值

时间:2019-01-24 13:32:48

标签: f# coroutine continuations

我想更好地理解延续和协程。 我想对它们进行编码而不使用seqasync工作流程。

我在F#中发现了一些协程的实现 this simple coroutinesand this from fsharpsnippets

我的问题是,例如,如何实现协程产量,该协程产量会向调用协程产生价值:

let anothercoroutine= coroutine {
    do! yieldvalue' "hello"
    do! yieldvalue' "world"
}
coroutine{
    let! a = yield' anothercoroutine
    let! b = yield' anothercoroutine
    return a + " " + b
} // it would return "hello world"

这只是我要完成的一个“ hello world”示例,但实际上并不需要anothercoroutine作为序列生成器,尽管它可以是...该代码可以并行运行与其他协程一起,已经计划这样做。

我想知道F#上是否存在一些隐含的限制。 我已经尝试过,但是似乎比预期的要困难,所以我需要知道我是否只是在解决一个不可能的问题上花费时间。

1 个答案:

答案 0 :(得分:0)

关于如何最好地在F#中实现协程以及现有的不同实现的优点,我们可以进行很多讨论,但是我将尝试回答您在此处提出的具体问题。具体来说,为什么不使用此语法:

let anothercoroutine= coroutine {
    do! yieldvalue' "hello"
    do! yieldvalue' "world"
}

这里的问题与F#计算表达式中do!的含义有关。这个方便的表格向我们展示了每个内置关键字在计算构建器中的作用:

De-sugared computations

如您所见,do!只是调用计算生成器的Bind函数,并带有一个接受单元的延续。因此,基本上暗示 expr 将是单位返回值,因此不是那种将用来从协程产生中间结果的价值生成函数。