我想更好地理解延续和协程。
我想对它们进行编码而不使用seq
或async
工作流程。
我在F#
中发现了一些协程的实现
this simple coroutines,and 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#
上是否存在一些隐含的限制。
我已经尝试过,但是似乎比预期的要困难,所以我需要知道我是否只是在解决一个不可能的问题上花费时间。
答案 0 :(得分:0)
关于如何最好地在F#中实现协程以及现有的不同实现的优点,我们可以进行很多讨论,但是我将尝试回答您在此处提出的具体问题。具体来说,为什么不使用此语法:
let anothercoroutine= coroutine {
do! yieldvalue' "hello"
do! yieldvalue' "world"
}
这里的问题与F#计算表达式中do!
的含义有关。这个方便的表格向我们展示了每个内置关键字在计算构建器中的作用:
如您所见,do!
只是调用计算生成器的Bind
函数,并带有一个接受单元的延续。因此,基本上暗示 expr 将是单位返回值,因此不是那种将用来从协程产生中间结果的价值生成函数。