【问题标题】:How do you write a SelectMany from a Task in F#您如何在 F# 中从任务中编写 SelectMany
【发布时间】:2020-07-07 11:49:08
【问题描述】:

我想从 F# 中的任务中编写 SelectMany 单子绑定。我将如何编写以下在 F# 中使用 language-ext 的 C# 代码?

Task<int> result = from task in Task.Run<int>(() => 40) select task + 2;

【问题讨论】:

  • 你想做什么?这不会在 C# 中编译,即使这样做也会很奇怪。也不是SelectMany,只是Select
  • 如果你有一个异步产生值的迭代器,你应该在 C# 中使用IAsyncEnumerable。 F# 中的等价物由AsyncSeq 库提供
  • @PanagiotisKanavos 你是对的!我使用的示例 C# 代码甚至都不正确!
  • 更改了描述,说明它适用于 C# 的语言扩展。如果您是读者,在这里发现自己并不了解单子绑定是什么,这是一个很好的例子adit.io/posts/…(它使用 Haskell,但我认为这是我见过的最好的例子之一)。

标签: f# c#-to-f# language-ext


【解决方案1】:

您可以使用 F# TaskBuilder library 获取任务的 F# 计算表达式(一元语法)。有了这个,你可以重写你的例子:

let result = task {
  let! t = Task.Run<int>(() => 40)
  return t + 2 }

【讨论】:

  • 使用基础 F#,这就是我最终要做的。让任务=异步{让! x = async { 返回 40} 返回 x + 2 }
  • 是的!如果您不特别介意使用任务还是异步,那么这会更好:-)
猜你喜欢
  • 1970-01-01
  • 2015-12-31
  • 2017-01-27
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多