问题标签 [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.
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 函数:
f# - 我的记录器计算表达式有什么问题?
在我试图实现的计算表达式下方。该值被包装在一个元组中,其中元组的第二项是一个字符串列表,表示沿途的日志条目。
但是,当我运行以下命令时,我没有得到预期的结果。我想知道我错过了哪里。
更新
为避免此错误,请将 传递给或--warnon:1182
的命令提示符。这将对未使用的“变量”发出警告。fsi
fsc
linq - 如何使 f# 查询表达式可重用?
我正在尝试习惯使用 f# 查询表达式。
首先,他们肯定很渴望,因为:
我想重用那个查询,所以我尝试了惰性计算:
现在,我想重新评估查询:
所以,什么也没发生,它不会重新计算。如何在不重新定义的情况下多次使用查询?
f# - 是否有必要在异步表达式中使用 else 分支?
我想编写以下代码:
F# 出于某种原因认为我需要这样写:
在后一种情况下,不会产生错误消息。但在我看来,这两段代码是等价的。有没有机会避免不必要的嵌套和缩进?
UPD。我要问的确实是可能的!请看示例,请参阅真实世界示例部分
我将引用代码:
因此,有可能,唯一的问题是是否可以async
通过扩展模块或其他方式以某种方式实现 in 。
f# - 如何编写一个计算表达式构建器来累积一个值并允许标准语言构造?
我有一个计算表达式构建器,可以随时建立一个值,并且有许多自定义操作。但是,它不允许标准的 F# 语言结构,而且我在弄清楚如何添加这种支持时遇到了很多麻烦。
举一个独立的例子,这是一个非常简单且毫无意义的计算表达式,用于构建 F# 列表:
我可以用它来构建列表就好了:
但是,这是一个编译器错误:
这是这样的:
我已经阅读了我能找到的所有文档和示例,但有些东西我没有得到。我尝试的每一个.Bind()
或.For()
方法签名只会导致越来越多的令人困惑的编译器错误。我可以找到的大多数示例要么在您进行过程中建立一个值,要么允许使用常规的 F# 语言结构,但我无法找到一个同时具备这两种功能的示例。
如果有人可以通过向我展示如何采用此示例并在构建器中添加对let
绑定和for
循环的支持来为我指明正确的方向(至少 - using
,while
并且try/catch
会很棒,但如果有人让我开始,我可能会弄清楚这些)然后我将能够感激地把这个教训应用到我的实际问题上。
f# - 重试单子和零构造
我正在尝试使用从我们心爱的堆栈溢出中获取的 Retry Monad:
我想用它来使我的文件复制代码更加健壮:
现在我注意到它有时会因“零”异常而失败。我试图删除member x.Zero() = failwith "Zero"
但现在我得到一个编译时错误:
仅当构建器定义“零”方法时才能使用此构造。
任何想法如何进行?
f# - 为什么这个计算表达式生成器在我的 for 循环中期望“单位”?
这是这个问题的后续问题。
我正在尝试创建一个计算表达式构建器,该构建器通过自定义操作累积值,同时还支持标准 F# 语言构造。为了讨论一个简单的示例,我使用了一个构建 F# 列表的计算表达式。感谢 kvb 和 Daniel 的建议,我走得更远了,但仍然遇到for
循环问题。
建设者:
这个版本允许我以前不能做的事情,例如:
但是,我仍然收到一个编译器错误:
在这种情况下,IDE 在 x in 下划线for x in
并告诉我,“这个表达式应该有类型 unit,但这里有 int 类型。”
我不太清楚为什么它期望循环变量是单元类型。显然我在某处得到了错误的方法签名,并且我怀疑我没有在我应该在的每个地方都通过我的累积状态,但是编译器错误并没有帮助我缩小我出错的地方。任何建议,将不胜感激。
f# - 如何在 F# 中为自定义计算操作定义 Yield 和 For
我正在为我的应用程序开发一些 DSL,这是我定义计算类型和构建器的方式:
结果代码应该是:
现在我想通过定义“需要”自定义操作do! needFn ["def"; "dd"]
来将语法更改为更好的语法,但会收到编译器的各种抱怨。这是正确的方法还是我滥用了计算表达式?
另一个问题是 for 不起作用 if do!在循环体内使用。
asynchronous - F# 计算表达式和任务并行库
我最近一直在使用 F#,最近编写了一个带有 C# Web 项目和 F# 类库的小型 MVC 应用程序,后者包含大部分代码。
我想使用更高版本的 MVC 的异步控制器功能,您可以在其中返回Task<ActionResult>
. 我正在使用 F# 异步计算表达式编写我的代码,但我非常恼火,因为我不得不不断地使用Async.AwaitTask
and将 Async<'T> 转换为 Task<'T> StartAsTask
。
由于我当时正在学习计算表达式,所以我认为“必须有一种方法可以将计算表达式与 Tasks 以及 Async 一起使用,以实现更好的 F#/C# 互操作”,所以我试了一下:
这似乎有效;运行以下代码:
产生结果:
它给出了异步的外观,如果您从计算表达式返回,您最终会得到正确的类型,所以我谨慎地将其标记为成功。
让我怀疑的事情是我找不到其他人尝试这个的任何例子,所以我很感激一些外部观点
- 这行得通吗?
- 这是一个好主意吗?
f# - F# 计算表达式和返回语句
在 Try F# 网站上,他们给出了一个计算表达式的示例:
这看起来有点像 Haskell 中的标准 Maybe monad。
但是,在真正的 Haskell 形式中,我想对两行使用 return:
成为:
但是它不起作用。我最接近的是:
但这看起来很脏。有什么方法可以在return
不显式使用计算构建器功能的情况下使用?