问题标签 [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.
syntax - `while`-loops 在 F# 计算表达式中的作用是什么?
如果您定义了构建器对象的方法,则可以在计算表达式While
中使用while
-loops 。该方法的签名是:While
为了比较,该For
方法的签名是:
您应该注意到,在While
- 方法中,主体是简单类型,而不是For
方法中的函数。
您可以在计算表达式中嵌入一些其他语句,例如let
和函数调用,但这些语句不可能在while
-loop 中多次执行。
为什么while
-loop 不执行多次,而只是重复执行?为什么与 for 循环有显着差异?更好的是,是否有一些在计算表达式中使用 while 循环的预期策略?
f# - 有没有办法让不同的执行做!然后让!在计算表达式中?
我需要不同的行为来做!然后让!在我的自定义计算表达式中。
我尝试通过以下方式实现这一目标:
但是编译器给了我一个错误:
无法根据此程序点之前的类型信息确定方法“绑定”的唯一重载。可用的重载如下所示(或在错误列表窗口中)。可能需要类型注释。
有没有办法有不同的实现 do! 然后让!?
f# - 重试 F# 中的计算表达式或其他构造
我希望能够在 F# 中编写一个计算表达式,如果它引发异常,它将能够重试操作。现在我的代码看起来像:
我需要能够重试每个函数一定次数,这是我在其他地方定义的。
我在想一个计算表达式可以在这里帮助我,但我不明白它如何帮助我删除将每个右侧显式包装到 Retryable<'T>
我可以看到计算表达式看起来像:
我知道 Monads 以粗略的方式是包装器类型,但我希望有办法解决这个问题。我知道我可以重载一个运算符,并且有一个非常简洁的语法来将一个操作转换为 Retryable<'T>,但对我来说,这只是让重复/包装更简洁;它还在那里。我可以将每个函数包装成一个 Retryable<'T>,但是再一次,我看不到做文章顶部所做的事情的价值(在每个操作上调用重试。至少它非常明确)。
也许计算表达式在这里是错误的抽象,我不确定。关于可以在这里做什么的任何想法?
f# - 如何修复使用自定义工作流构建器的计算表达式生成的这些错误?
从MSDN文档中我了解到,如果实现了 Run,它将在计算表达式结束时自动调用。它说:
将为计算表达式生成。如果未在工作流构建器中定义运行和/或延迟,则它们将被省略。我期待我的 ReaderBuilder 在自动调用 Run 时返回 MyItem 对象列表。所以我不明白为什么会出现类型不匹配错误。这些错误是由我的代码列表末尾的 ProcedureBuilder foo 中的 return 语句生成的。有人可以解释一下我对工作流构建器的误解以及我错误地实现了什么吗?
我收到以下错误:
“列表”类型与“ReaderBuilder”类型不兼容
类型约束不匹配。“a list”类型与 ReaderBuilder 类型不兼容 “a list”类型与“ReaderBuilder”类型不兼容
f# - 如何更改 Rx Builder 实现以修复堆栈溢出异常?
我正在尝试提出一个 Rx Builder 以在 F# 计算表达式语法中使用反应式扩展。如何修复它以使其不会炸毁堆栈?就像下面的 Seq 示例。是否有任何计划将 RxBuilder 的实现作为响应式扩展的一部分或作为 .NET Framework 未来版本的一部分?
asynchronous - 如何构建递归计算表达式构建器
我想做的是有一个函数,我可以重复将转换函数传递给并接收组合转换,转换函数的形式为'a ->'b
即,而不是像这样组成一个固定的工作流程:
我希望能够做到这一点:
所以我可以简单地调用组合输入来获取工作流的结果。
如果没有达到值限制,或者编译器将所有转换器限制为相同类型,这是否可行?
f# - 如何在可能的计算构建器中实现延迟?
这是我到目前为止所拥有的:
whileLoop
可以很好地支持for
循环,但我看不到如何支持 while 循环。部分问题是 while 循环的翻译使用delay
,在这种情况下我无法弄清楚。下面明显的实现可能是错误的,因为它不会延迟计算,而是运行它!
没有延迟也有try...with
障碍try...finally
。
f# - F#:有没有办法扩展 monad 关键字列表?
在 F# monad 中,如果您说let!
,编译器会将其转换为Bind
您在 monad 构建器上定义的成员。
现在我看到有 Query monad,如MSDN 上所示,您可以在其中说:
和select
and count
,例如,将被翻译成QueryBuilder
成员Linq.QueryBuilder.Select和Linq.QueryBuilder.Count
。
我的问题是,这种关键字到成员的映射是硬连线到 F# 编译器中的,还是可扩展的?例如,我可以这样说:
并以某种方式告诉bar
映射到FooMonadBuilder.Bar()
方法的 F# 编译器?
f# - fsharp / dotnet 和时态数据库
我正在寻找一种将时间意识尽可能直接地整合到我的课程中的方法。我处理的是随时间变化很大的数据,比如股价,所以这可能需要一些注意,并在一个地方处理以确保“关注点分离”。
您在时态数据/数据库方面有类似的经验吗?
你可以推荐阅读/了解什么?
(我正在考虑将我的计算包装在 TimeSlice(date) 计算表达式构建器中,以便将检索范围限定到构成我计算的“范围”的指定日期。像
f# - 在 F# 的计算表达式中定义新关键字
F# 3.0 测试版包含一个带有大量新关键字的查询 {}计算表达式。
如何在计算构建器中定义自己的关键字?