问题标签 [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 投票
1 回答
182 浏览

f# - 查询表达式自联接

我怎样才能改变这个查询表达式的join子句,这样我就不必包装parent.ID一个option只是为了加入一个child.ParentID可能是的候选人None

谢谢!

0 投票
1 回答
481 浏览

f# - 异步计算没有捕获 OperationCancelledException

我正在尝试向 URL 发出异步 Web 请求,如果请求时间过长,该请求将返回。我正在使用 F# 异步工作流和 System.Net.Http 库来执行此操作。

但是,我无法捕获工作async流中 System.Net.Http 库引发的 Task/OperationCancelledExceptions。相反,异常是在 Async.RunSynchronously 方法中引发的,您可以在此堆栈跟踪中看到:

编码:

0 投票
0 回答
140 浏览

f# - 传播单子计算表达式时出错

我正在尝试编写一个计算表达式,该表达式可以有效地处理来自所有相关 let 的警告和错误!参数并将它们与给定计算的结果结合起来。问题是从所有使用的 let 中获取错误列表!在定义的计算结果之后将它们连接起来。为了显示:

给定类型

以及此阶段的粗略绑定函数:

我想编写一个计算函数,允许我执行以下操作:

结果为 Value(11, ["ERROR", "ERROR2"])

所以我这样定义了一个不完整的构建器(注意 Return() impl 缺失)

在 C# 中,我可以使用自定义类型上的自定义 SelectMany(source, calc, resultSelector) 扩展方法轻松完成此操作,并且 LINQ 查询语法会出现错误。像这样:

我想在 F# 中做同样的事情 - 这可能吗?

0 投票
2 回答
194 浏览

f# - 我可以访问计算表达式的参数吗?

是否可以在计算表达式中创建方法或独立函数,以便以后由计算表达式的规范方法之一使用?

我想要这样的东西:

但是编译器抱怨get_int没有定义。

0 投票
2 回答
118 浏览

f# - 将工作流/monad 嵌入另一个工作流/monad?

例如,我有一个日志记录工作流,我想在日志记录工作流中使用异步。如何bind在异步工作流程中调用日志记录?

编辑:我听说在 F# 中使用工作流替换 AOP 以实现横切关注点是个好主意。我不确定如何处理嵌入问题。或者使用工作流不是一个好主意?

0 投票
3 回答
533 浏览

f# - F#“有状态”计算表达式

我目前正在学习 F# 并遇到了一些绊脚石;我认为其中很多是在学习功能性思考。

我目前正在学习的一件事是计算表达式,我希望能够定义一个处理某些跟踪状态的计算表达式,例如:

我希望能够拥有它myOptionsOption<'T> list因此每个let!绑定操作都会有效地使构建器在执行过程中“跟踪”定义的选项。

我不想使用可变状态来做这件事——例如,有一个由构建器维护的列表,并随着每次bind调用而更新。

有没有办法让它成为可能?


更新:结果Option<'T> list类型只是代表性的,实际上我可能会有一个OptionGroup<'T>类型来包含一个列表以及一些附加信息 - 所以正如 Daniel 下面提到的,我可以使用一个简单列表的列表推导。

0 投票
1 回答
289 浏览

f# - 在计算表达式中构造 if..then 的 else 分支调用零背后的直觉

计算表达式中的方法的msdn 文档Zero指出

调用计算表达式中else的表达式的空分支。if...then

假设我们正在使用一个identity没有Zero定义的计算构建器。

下面的代码是允许的

但是,以下代码是不允许的,并且会因编译器错误而失败

仅当计算表达式构建器定义“零”方法时,才可以使用此控制构造

为什么编译器坚持调用Zero分支else?这背后的直觉是什么?

0 投票
1 回答
476 浏览

f# - (如何)我可以让这个单子绑定尾递归吗?

我有一个叫做 Desync 的 monad -

它允许使用计算表达式以看似顺序的方式编写跨多个游戏时间执行的游戏逻辑的实现。

不幸的是,当用于持续无限数量的游戏刻度的任务时,它会因 StackOverflowException 而崩溃。即使它没有崩溃,它也会以这样的笨拙的堆栈跟踪结束 -

我希望通过使绑定函数尾递归的左案例来解决问题。但是,我不确定两件事 -

1)是否可以完成,以及 2)实际如何完成。

如果在这里不可能使绑定尾递归,是否有某种方法可以重组我的 monad 以使其成为尾递归?

编辑 3(包含以前的编辑):这是实现异步组合器的附加代码,我将使用它来演示堆栈溢出 -

这是 Either 实现 -

最后,这是一段简单的代码,会产生堆栈溢出 -

0 投票
0 回答
198 浏览

f# - 我可以将参数添加到 F# 中的计算表达式构造函数吗

给定以下代码

我想这样做

但我收到此错误消息

我也试过这个

可悲的是,所有人都给我一个错误。

0 投票
1 回答
711 浏览

f# - 我可以为 DSL 之类的构建器创建嵌套计算表达式吗?

这就是我想做的:

这打破了在线

无论如何要向 F# 解释这个自定义操作确实应该接受计算表达式?