问题标签 [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.
.net - 何时在计算表达式中实现“零”成员?
为什么我不能pattern matching function
在没有实现Zero
成员的计算表达式中使用?
例如,有人可以解释为什么它允许pattern matching expression
但不允许pattern matching function
吗?
f# - 构造复杂对象图的计算表达式
给定以下类型:
我正在使用以下构建器:
创建类型的记录Passenger
,如下所示:
我将如何组合 thePassengerBuilder
和 theTripBuilder
以便我可以实现这种用法?
返回Passenger
如下记录:
asynchronous - 返回开始异步在 F# 函数中调用非异步函数来自 C#?
假设我想从 F# 调用这个 C# 函数:
问题是这个功能是 CPU 密集型的,我不想阻止它。不幸的是,C# 库没有Task<Bar> BazAsync()
重载。
然后我想自己提供异步版本,方法是创建一个调用它并返回 (already started) 的 F# 函数Async<Bar>
。也就是说,我不想使用System.Threading.Task<Bar>
.
我想我正在寻找的是等同Task<T>.Run()
于 F# Async 的做事方式。
我已经看过以下选项:
Async.StartAsTask
-> 处理 C#ish 任务类型。Async.Start
和Async.StartImmediately
->Async<unit>
不接收Async<T>
是Async.StartChild
我要找的吗?如果是,那将是:
但是,如果以上是解决方案:
- 为什么大多数关于 F# 异步工作流的文档都没有提到 StartChild?
- 为什么 BazWrapper 返回
Async<Async<Bar>>
而不是Async<Bar>
?
monads - ReasonML 是否具有等效于 F# 的计算表达式?
在 F# 中,我们有计算表达式,当在各种计算上下文(异步、可选等)中工作时,它可以减少样板和嵌套。
- ReasonML 是否有这样的等价物?
- 如果是这样,语法是什么?
f# - F# 计算表达式:可以用来简化这段代码吗?
我最近开始使用计算表达式来简化我的代码。到目前为止,对我来说唯一有用的是 MaybeBuilder,它是这样定义的:
但我想探索其他用途。一种可能性是我目前面临的情况。我有一些定义对称矩阵的供应商提供的数据。为了节省空间,只给出了矩阵的三角形部分,因为另一边只是转置。因此,如果我在 csv 中看到一行
美国广播公司,高清,123
这意味着行 abc 和列 def 的值为 123。但我不会看到诸如
定义,美国广播公司,123
因为由于矩阵的对称性,该信息已经给出。
我已经在 a 中加载了所有这些数据,Map<string,Map<string,float>>
并且我有一个函数可以为我获取任何看起来像这样的条目的值:
现在我知道了计算表达式,我怀疑匹配语句可以被隐藏。我可以像这样使用 MaybeBuilder 稍微清理一下
这样做,我已经从 4 个匹配语句变成了 2 个。有没有一种(不是人为的)方法可以通过使用计算表达式来进一步清理它?
f# - 将结果列表转换为计算表达式中列表的结果?
我有一个Result<'T, 'E> list
我想Result<'T list, 'E>
按照以下规则变成一个单一的:
- 如果有
Result
,Error
那么结果应该是Error
- 如果结果是 an
Error
它应该是Error
列表中的第一个 - 如果每个结果都是 an
OK
那么结果应该是 anOk
并且应该保持列表顺序
所以我试了一下,实现了如下:
但是,这似乎已经在标准库中实现了。有吗?
其次,我有一个这样的计算表达式Result
:
我可以all
在 a 内部使用,result { ... }
但可以进一步集成吗?例如通过实施ResultBuilder.For
?
asynchronous - F# 异步工作流/任务与免费 monad 相结合
我正在尝试使用免费的 monad 模式构建用于消息处理的管道,我的代码如下所示:
我根据这篇文章写的
然而,让这些方法异步对我来说很重要(Task
最好是,但Async
可以接受),但是当我为我创建一个构建器时pipeline
,我不知道如何使用它 - 我如何等待一个Task<'msgOut>
或者Async<'msgOut>
我可以发送它并等待这个“发送”任务?
现在我有这段代码:
返回PipeProgram<'b, 'a, Async<PipeProgram<'c, 'a, Async>>>
f# - Choice<'T1,'T2> 上的一元操作
我在标准库中找不到choice
允许我编写的对象
就像在 Haskell 中一样。我是否遗漏了什么,或者是否有第三方库可以编写这类东西,或者我必须重新发明这个轮子?
f# - 计算表达式中的类型推断错误
twelve
没有引入任何问题,但twelve2
给出了
FS0001:这个表达式应该有类型'Identity<'a>',但这里有类型''b *'c'
就行了let! t = three
。
我认为twelve
并且twelve2
应该是等价的……我弄错了吗?
f# - 为什么我不能使用匹配!在计算表达式中了吗?
从 F# 4.5 开始,比赛!关键字允许您内联对另一个计算表达式的调用并对其结果进行模式匹配
据我所知,我使用的是 F# 4.5。
但是VS2017不喜欢下面的代码
匹配!未被识别为有效语法。
我需要做什么才能完成这项工作?