【问题标题】:Coroutines on F# that yields a valueF# 上产生值的协程
【发布时间】:2019-06-18 06:15:09
【问题描述】:

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

我在F# 中找到了几个 Coroutines 的实现 this simple coroutines, and this from fsharpsnippets

我的问题是如何实现一个协程 yield 来为调用协程产生值,例如:

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# 是否有一些隐含的限制。 我试过了,但似乎比预期的要难,所以我需要知道我是否只是把时间花在一个不可能的问题上。

【问题讨论】:

  • 我不确定我是否理解这个问题。您不需要那些 sn-ps 来执行异步工作流、创建序列生成器或在另一个序列生成器中使用序列。这些 sn-ps 是 computation expressions 的示例,asynchronous workflowsquery expressions 是基于此
  • 是的,我知道,我不需要序列生成器,我想要可以向其他 cooutie 发送值的协程,并且我特别想对其进行编码,因为我想了解所有的本质, .我会尝试重新制定。
  • @PanagiotisKanavos 关键是我希望能够编写具有特定custom 工作流程的代码,并且我想了解它是如何完成的。一些学习资源将不胜感激。我已经知道计算表达式加糖的单子句法,我了解几个单子,例如状态单子和延续单子……但是在协程中,文献不足

标签: f# coroutine continuations


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您花时间回答。我修改了我的问题,因为我似乎不清楚。我的问题更多是关于协程而不是计算表达式。我知道计算表达式是如何工作的,以及为什么以及为什么应该使用 bang 版本的运算符。
  • 不知何故你的答案是对的,为什么do! yieldvalue "some value" 不能被使用,因为它似乎返回一个值,但我的问题正是:如何编码yieldvalue 所以它需要@ 987654329@将该值传递给调用协程并返回unit作为一个整体...允许突变!
  • yiled' 可以称为await,所以它更有意义,并且不知何故awaityieldvalue 应该作为一个整体工作。但我真的不明白如何
  • @sabotero 如果yieldvalue 能够以某种方式影响协程的状态(而且我认为没有其他方法可以按照您的建议进行操作),那么它必须被实现为[<CustomOperation>] 在生成器上。它不能作为函数实现,因为该函数无法影响协程​​的状态。
  • 我同意你的观点,它应该是某个地方的一些额外状态......因为我理解计算表达式它们只是一些语法糖,所以一些如何实现 yieldvalue 以便它可以影响协程状态,然后这个实现可能在[<CustomOperaion("yieldvalue">] 后面,所以在协程构建器coroutine { yieldvalue "hello" } 中使用它会更好。我同意您可以将所需的结构放入构建器中,但您也可以将它们放入另一个类或模块或非常复杂的函数中,然后在构建器类中使用它
猜你喜欢
  • 2017-11-08
  • 2015-04-22
  • 2019-04-11
  • 2013-11-17
  • 2017-06-04
  • 1970-01-01
  • 2013-06-19
  • 2023-03-05
  • 2018-11-21
相关资源
最近更新 更多