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

.net - 在 F# 中编写异步计算

我正在编写一个异步 HTTP API 客户端模块/库。为了使一切尽可能 DRY,我试图从进行 API 调用的不同部分组合每个 HTTP API 调用,自下而上:构建请求,获取响应,将响应读取到字符串缓冲区,解析 JSON 内容将该字符串缓冲区放入一个对象中。

到目前为止,我有这个代码:

而且,如您所见,我用我自己的添加扩展了 Async 模块:

我试图实现的目标是构建一个具有我可以在async块中使用的功能的模块,以利用计算表达式语法的所有优势。我想知道我是否做得对,是否选择了正确的名字,等等。我几乎没有接受过正规的函数式编程教育,有时我什至不确定我是否知道自己在做什么。

0 投票
1 回答
116 浏览

f# - 为什么专门化 monad 的类型会导致错误?

以下计算序列可以正常工作:

现在假设我采用相同的 monad 并将其专门用于整数类型:

有人可以在这里解释我理解的失败吗?即使是提示也会有所帮助,以防写出完整的解释需要太长时间。

0 投票
1 回答
718 浏览

f# - f# 代码生成的计算表达式

虽然人们找到了一些关于如何使用 f# 计算表达式进行组合递归下降解析器的示例,但我尝试将它们用于相反的情况。创建易于阅读的代码以从一些 XML 数据生成 (c++) 源文件。然而,我被困住了,如果社区能帮助我找到我的误解,我将不胜感激。为了公众利益,我希望这篇文章很快会展示如何通过 f# 计算表达式,monadic 风格以一种很酷的方式来做代码生成器。

这是我到目前为止走了多远(为了这个问题的目的,为了简化,省略了生成的输入数据):

显然,上面的代码充其量只显示了我试图实现的目标。我的研究没有产生任何关于如何使用计算表达式的好例子。我发现的许多示例都停止显示构建器的声明方式或稍后声明,但未能展示如何实际编写最终表达式。

因此,如果有人有时间发布一个真实的示例,它可以完成我上面的乱码代码试图做的事情,这将是最具启发性的,并且填补了互联网上关于这个(至少对我而言)令人困惑的方面的空白f# 编程。

在我上面的代码示例中,我也看不到我首先从 builder monad 中得到了什么。与非单子实现相比,格式化程序代码看起来并不干净。

如果有人在答案帖子中将签名和类型添加到参数中,那就太好了;至少对我来说,与“让编译器查找类型”风格相比,它更容易理解。

0 投票
1 回答
528 浏览

f# - 引用计算表达式中的 F# 惰性

在计算表达式上使用 Quote 成员将工作流转换为 AST,但希望它GetEnumerator()不会在构造引用时在序列上实际调用(即,具有某种形式的惰性)。在我的用例中,序列代表一个远程数据源,调用它的GetEnumerator()成员实际上会出去并查询它。

  1. 有没有办法在 Source 成员上隐式使用 Lazy 类型(并且仍然使用 Quote 成员),这样它就不会急切地调用GetEnumerator(),而是根本没有加载值?

  2. 为什么将 let 绑定定义为模块的属性和另一个函数中的变量在引号中被视为不同的实体,即PropertyGetvs Value

一些测试代码...

这导致以下两个引用

0 投票
2 回答
590 浏览

f# - F#:为 seq{} 与其他计算工作流生成的 IL 代码

当我比较ILF# 为表达式生成的代码seq{}与为用户定义的计算工作流生成的代码时,很明显它们seq{}的实现方式非常不同:它生成的状态机类似于 C# 用于其迭代器方法的一次。另一方面,用户定义的工作流使用您所期望的相应的构建器对象。

所以我想知道 - 为什么有区别?

这是出于历史原因吗,例如“seq 在工作流之前就存在”?
或者,是否可以获得显着的性能?
还有什么原因?

0 投票
4 回答
363 浏览

f# - 如何将正向管道表达式转换为计算表达式?

所以,我想构建一个自定义计算表达式,让我可以把它变成 -

变成这样的东西 -

这是可能的,还是接近可能的?如果是这样,可以采取什么方法?这是一个单子,还是更小的东西?

0 投票
3 回答
1221 浏览

haskell - Haskell 程序员的计算表达式

我正在寻找学习 F#,但让我感到困惑的一件事是计算表达式(do-notation??)语法和脱糖。

在 haskell 中,您有一个非常简单的 Monad 类型类和将 do-notation 脱糖到 bind 和 return 的规则。添加关键字没有魔法。唯一必须匹配的是类型。

在 F# 中有一堆构建器、关键字和复杂性。

关于如何将一个概念映射到另一个概念是否有很好的解释?

我基本上想知道我如何映射

到F#。

haskell 中唯一的关键字是 do、(<-) 和 let。

0 投票
1 回答
1047 浏览

haskell - 如何在 F# 中正确丢弃(单子)计算的结果

在 Haskell 中,我可以写:

在 F# 中,我已经走到了这一步:

换句话说,我必须引入这个未使用let! _ =的绑定来丢弃我不需要的“空间”解析器(monad)的解析值。

如何在 F# 中避免这些无用的绑定?我曾尝试使用 do!,但出现错误(因为我的>>=函数不采用类型单位,而是采用 'a):

这是我的构建器定义:

我需要定义>>功能吗?将 Combine() 添加到构建器?任何想法如何正确地做到这一点?代码示例?

0 投票
2 回答
326 浏览

f# - F# 计算表达式 - 类型问题

我正在与几行可悲的代码作斗争,但无法解决这个问题——无论出于何种原因,我都无法理解 F# 类型系统这一方面的原则,到目前为止,我的所有阅读都没有奏效。

谁能向我指出我在这里犯的相当愚蠢的小学生错误?我知道我在做一个,我只是看不到它!我正在努力摆脱痛苦的初学者领域,因此了解为什么这不起作用的全部原则是我的目标 - 任何帮助都将不胜感激!

这是一个简单的练习——实际上只是一个练习,实际上并不需要一个 monad 来执行,但是我真的希望这些东西能在我的下一个项目中使用。

我得到以下信息:

更新:根据下面的帮助,我现在有这个工作:

尽管在概念上可能还没有工作——获得打印的价值并没有发生。我会继续破解 - 我已经阅读了大量的书籍,这就是我从中得到练习的地方,但我想得到这个概念的唯一方法是继续与之抗争。

我在我的博客上以更简单的形式成功:http ://richardgriffiths.azurewebsites.net/?p=2332 所以我只需要打破类型系统的语法/概念障碍。

0 投票
2 回答
563 浏览

f# - 在计算表达式中争论 TryWith

(未能“理解”FParsec,我按照我在某处读到的建议开始尝试自己编写一个小解析器。不知何故,我发现了一个尝试单子化它的机会,现在我有 N 个问题......)

这是我的“结果”类型(简化)

这是计算表达式构建器

在第一个示例中,一切都按预期工作(编译):

我的问题在这里:我希望能够在“组合”函数中捕获任何失败并返回失败,但它说我应该定义一个“零”。

不知道我应该在零中返回什么,我只是扔了member m.Zero() = Failure("hello world"),现在它说我需要TryWith

所以:

现在它想要延迟,所以member m.Delay f = (fun () -> f()).

此时它显示(在ex -> Failure),,This expression should have type 'unit', but has type 'Result<'a>'我举起双臂转向你们......

播放链接: http: //dotnetfiddle.net/Ho1sGS