问题标签 [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 回答
145 浏览

f# - 检查异步计算的状态

假设我想在做一堆其他工作的同时经常检查一个长时间运行的异步操作的状态。是否可以检查Async计算表达式是否完成(就像Task'IsCompleted属性一样)?

换句话说,Async除了通过其计算表达式构建器提供的方法之外,是否有其他方式与其他交互,或者我应该使用Tasks 代替吗?

0 投票
1 回答
155 浏览

f# - 序列表达式和多态递归如何一起发挥作用?

这个项目对我来说确实是一个问题的来源

我已经了解了多态递归,并且理解为什么它是一种特殊情况,因此 F# 需要完整的类型注释。

对于常规功能,我可能需要一些技巧,但通常会做对。现在我正在尝试使(工作)基础适应toSeq更专业的手指树,但不能。

我的感觉是计算表达式的使用与它有关。这是精简的工作版本:

我无法编译的是这个:

我收到的错误消息说

错误类型不匹配。期望
FingerTree<Size,Node<Size,Value<'a>>> -> 'b
但给定了
FingerTree<Size,Value<'c>> -> seq<'c>
类型 'Node<Size,Value< 'a>>' 与类型 'Value<'b>' 不匹配

曲线下划线的递归调用toSeq

我知道“更深”的类型被封装在 aNode中,并且在工作代码中我​​只是在之后解压缩它。但是在我有机会解包之前,编译器已经跳闸了。尝试 afor (Value deep) in toSeq deeper do yield deep有同样的问题。

我已经有一个出路,即使用toSeq“基地”TreeSeq.map unpack之后。不正确,尝试会产生非常相似的错误消息。

我很好奇是什么让这段代码中断以及如何修复它。

0 投票
1 回答
276 浏览

f# - 计算表达式与应用函子以及什么不是

不完全确定标题描述它没问题,但我确实有以下代码:

paket.依赖项:

一些.fsx:

这个“练习”的重点是编写 GetDB2,使其与 GetDB1 一样,但使用运算符(应用程序?),但我目前无法转过头来管理它。

上面的代码可以编译,但是GetDB1和GetDB2的签名不相等,我显然做的不对

我已经在 GetDB2 中尝试了几个版本和命令,但我或多或少总是以与上面相同的签名结束。

我最初的总体想法是编写小函数来做他们应该做的事情,然后添加异常处理(protect),然后相应地“包装”和“解包”。

当然,这也可能不是完全正确的想法。

有人可以在这里为我指明一些方向以进行进一步的研究、代码示例或其他任何东西吗?实际上,此时欢迎任何类型的任何评论;-)

FSharpx 文档

附录

我认为以下应该与上面大致相同,但没有 mongodb 依赖项。

0 投票
2 回答
1573 浏览

f# - How to keep the stacktrace when rethrowing an exception out of catch-context?

TL;DR: how to raise a previously caught exception later on, while preserving the original exception's stacktrace.

Since I think this is useful with the Result monad or computation expression, esp. since that pattern is often used for wrapping an exception without throwing it, here's a worked out example of that:

And now let's use it:

The problem is that the stacktrace will not include the source of the exception (here namely the calc function). If I run the code as written, it will throw as follows, which gives no information to the origin of the error:

Using reraise() won't work, it wants a catch-context. Obviously, the following kind-a works, but makes debugging harder because of the nested exceptions and could get pretty ugly if this wrap-reraise-wrap-reraise pattern gets called multiple times in a deep stack.

Update: TeaDrivenDev suggested in the comments to use ExceptionDispatchInfo.Capture(ex).Throw(), which works, but requires to wrap the exception in something else, complicating the model. However, it does preserve the stacktrace and it can be made into a fairly workable solution.

0 投票
3 回答
1522 浏览

haskell - 学术用途之外的延续单子是否有现实世界的适用性?

(后来的访问者:这个问题的两个答案都给出了很好的见解,如果你有兴趣,你可能应该同时阅读它们,我只能将一个作为 SO 的限制除外)

从我在网上找到的关于 continuation monad 的所有讨论中,他们要么提到了如何将它与一些琐碎的例子一起使用,要么他们解释说它是一个基本的构建块,就像这篇关于所有 monad 之母的文章中的 continuation monad一样。

我想知道是否有超出这个范围的适用性。我的意思是,在延续单子中包装递归函数或相互递归是否有意义?它有助于可读性吗?

这是取自此 SO 帖子的延续模式的 F# 版本:

它仅仅是学术兴趣,例如帮助理解单子或计算构建器?还是有一些现实世界的适用性,增加了类型安全性,或者它是否规避了其他难以解决的典型编程问题?

即,来自 Ryan Riley 的带有 call/cc 的 continuation monad表明处理异常很复杂,但它没有解释它试图解决什么问题,并且示例也没有说明为什么它特别需要这个 monad。诚然,我只是不明白它的作用,但它可能是一个宝库!

(注意:我对了解 continuation monad 的工作原理不感兴趣,我想我对它有相当的了解,只是看不出它解决了什么编程问题。)

0 投票
1 回答
140 浏览

f# - 为什么带有计算表达式的 PSeq.map 似乎挂起?

我正在编写一个使用FSharp.Collections.ParallelSeq重试计算的刮板。我想从多个页面并行检索 HTML,并且我想在请求失败时重试请求。

例如:

GetHtmlForAllPages当我尝试从代码进行交互时main似乎挂起。单步执行代码向我展示了PSeq.map开始处理pages.

发生了什么导致retry计算表达式永远不会启动/完成?PSeq和之间有什么奇怪的相互作用retry吗?

如果我创建GetHtmlForAllPages一个函数并调用它,代码会按预期工作。我很好奇什么时候GetHtmlForAllPages是一个领域?

0 投票
3 回答
82 浏览

.net - 使用单例区分联合制作计算表达式

如果我有一个尝试将起始数字除以两次的函数。整个工作流程必须返回一个布尔值。

以下构建器是否正确?

0 投票
2 回答
448 浏览

f# - 如何用条件实现 List Monad(计算表达式)?

我试图了解如何使用 F# 计算表达式,这确实让我感到困惑。

下面的例子对我有一定的意义。

我的问题是,您将如何向此计算表达式添加条件?具体来说,您将如何更改它以仅返回 x 值严格小于 y 值的元素列表?(我们以后不要过滤掉它)。

0 投票
1 回答
231 浏览

.net - 使用计算表达式重新分配函数中的变量

基于问题How can I re-assign a variable in a function in Haskell? Congo 0,有一个 haskell 解决方案可以改变a中的刚果大象总数function

看完了计算表达式系列,我还是不知道如何正确地为这个问题编写一个 CE builder。如何使用 F# 的 CE 重新分配函数中的变量?

0 投票
1 回答
180 浏览

f# - 如何使用 CustomOperations 和一些让有状态的构建器实现

我正在努力定义一个有状态的构建器,但我无法解决一些编译器错误

但是现在我想介绍一个let!yield所以我可以添加其他项目而无需通过定义的 CustomOperations 以便例如我可以如下

任何帮助是极大的赞赏。Bonus Karma 将被发送以解释编译器如何将其重写为一系列Binds

谢谢