问题标签 [computation-expression]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
123 浏览

asynchronous - 从 FSharpX(或 ExtCore)使用有限数量的 Workers 和 AsyncSeq 并发下载

我尝试使用 AsyncSeq 模块以有限数量的工人进行并发下载。

基于https://github.com/fsprojects/fsharpx/blob/master/samples/Crawler.fsx的 FSharpX 示例

我假设 z 得到类似 seq ["dl URL 3"; "dl URL 5"; ... ] 因为“下载”返回一些内容。阻塞队列上的工作人员按预期工作:

问题是,为什么 z 是一个空列表?而不是预期的 seq ["dl URL 3"; "dl URL 5"; ...]?

作为参考,这里是 toBlockingSeq 函数:

0 投票
2 回答
376 浏览

f# - 我的记录器计算表达式有什么问题?

在我试图实现的计算表达式下方。该值被包装在一个元组中,其中元组的第二项是一个字符串列表,表示沿途的日志条目。

但是,当我运行以下命令时,我没有得到预期的结果。我想知道我错过了哪里。

更新

为避免此错误,请将 传递给或--warnon:1182的命令提示符。这将对未使用的“变量”发出警告。fsifsc

0 投票
1 回答
159 浏览

linq - 如何使 f# 查询表达式可重用?

我正在尝试习惯使用 f# 查询表达式。

首先,他们肯定很渴望,因为:

我想重用那个查询,所以我尝试了惰性计算:

现在,我想重新评估查询:

所以,什么也没发生,它不会重新计算。如何在不重新定义的情况下多次使用查询?

0 投票
2 回答
203 浏览

f# - 是否有必要在异步表达式中使用 else 分支?

我想编写以下代码:

F# 出于某种原因认为我需要这样写:

在后一种情况下,不会产生错误消息。但在我看来,这两段代码是等价的。有没有机会避免不必要的嵌套和缩进?

UPD。我要问的确实是可能的!请看示例,请参阅真实世界示例部分

我将引用代码:

因此,有可能,唯一的问题是是否可以async通过扩展模块或其他方式以某种方式实现 in 。

0 投票
4 回答
1986 浏览

f# - 如何编写一个计算表达式构建器来累积一个值并允许标准语言构造?

我有一个计算表达式构建器,可以随时建立一个值,并且有许多自定义操作。但是,它不允许标准的 F# 语言结构,而且我在弄清楚如何添加这种支持时遇到了很多麻烦。

举一个独立的例子,这是一个非常简单且毫无意义的计算表达式,用于构建 F# 列表:

我可以用它来构建列表就好了:

但是,这是一个编译器错误:

这是这样的:

我已经阅读了我能找到的所有文档和示例,但有些东西我没有得到。我尝试的每一个.Bind().For()方法签名只会导致越来越多的令人困惑的编译器错误。我可以找到的大多数示例要么在您进行过程中建立一个值,要么允许使用常规的 F# 语言结构,但我无法找到一个同时具备这两种功能的示例。

如果有人可以通过向我展示如何采用此示例并在构建器中添加对let绑定和for循环的支持来为我指明正确的方向(至少 - usingwhile并且try/catch会很棒,但如果有人让我开始,我可能会弄清楚这些)然后我将能够感激地把这个教训应用到我的实际问题上。

0 投票
3 回答
331 浏览

f# - 重试单子和零构造

我正在尝试使用从我们心爱的堆栈溢出中获取的 Retry Monad:

我想用它来使我的文件复制代码更加健壮:

现在我注意到它有时会因“零”异常而失败。我试图删除member x.Zero() = failwith "Zero"但现在我得到一个编译时错误:

仅当构建器定义“零”方法时才能使用此构造。

任何想法如何进行?

0 投票
1 回答
271 浏览

f# - 为什么这个计算表达式生成器在我的 for 循环中期望“单位”?

这是这个问题的后续问题。

我正在尝试创建一个计算表达式构建器,该构建器通过自定义操作累积值,同时还支持标准 F# 语言构造。为了讨论一个简单的示例,我使用了一个构建 F# 列表的计算表达式。感谢 kvb 和 Daniel 的建议,我走得更远了,但仍然遇到for循环问题。

建设者:

这个版本允许我以前不能做的事情,例如:

但是,我仍然收到一个编译器错误:

在这种情况下,IDE 在 x in 下划线for x in并告诉我,“这个表达式应该有类型 unit,但这里有 int 类型。”

我不太清楚为什么它期望循环变量是单元类型。显然我在某处得到了错误的方法签名,并且我怀疑我没有在我应该在的每个地方都通过我的累积状态,但是编译器错误并没有帮助我缩小我出错的地方。任何建议,将不胜感激。

0 投票
1 回答
279 浏览

f# - 如何在 F# 中为自定义计算操作定义 Yield 和 For

我正在为我的应用程序开发一些 DSL,这是我定义计算类型和构建器的方式:

结果代码应该是:

现在我想通过定义“需要”自定义操作do! needFn ["def"; "dd"]来将语法更改为更好的语法,但会收到编译器的各种抱怨。这是正确的方法还是我滥用了计算表达式?

另一个问题是 for 不起作用 if do!在循环体内使用。

0 投票
0 回答
460 浏览

asynchronous - F# 计算表达式和任务并行库

我最近一直在使用 F#,最近编写了一个带有 C# Web 项目和 F# 类库的小型 MVC 应用程序,后者包含大部分代码。

我想使用更高版本的 MVC 的异步控制器功能,您可以在其中返回Task<ActionResult>. 我正在使用 F# 异步计算表达式编写我的代码,但我非常恼火,因为我不得不不断地使用Async.AwaitTaskand将 Async<'T> 转换为 Task<'T> StartAsTask

由于我当时正在学习计算表达式,所以我认为“必须有一种方法可以将计算表达式与 Tasks 以及 Async 一起使用,以实现更好的 F#/C# 互操作”,所以我试了一下:

这似乎有效;运行以下代码:

产生结果:

它给出了异步的外观,如果您从计算表达式返回,您最终会得到正确的类型,所以我谨慎地将其标记为成功。

让我怀疑的事情是我找不到其他人尝试这个的任何例子,所以我很感激一些外部观点

  1. 这行得通吗?
  2. 这是一个好主意吗?
0 投票
2 回答
190 浏览

f# - F# 计算表达式和返回语句

在 Try F# 网站上,他们给出了一个计算表达式的示例:

这看起来有点像 Haskell 中的标准 Maybe monad。

但是,在真正的 Haskell 形式中,我想对两行使用 return:

成为:

但是它不起作用。我最接近的是:

但这看起来很脏。有什么方法可以在return不显式使用计算构建器功能的情况下使用?