问题标签 [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.
f# - 部分延迟计算构建器
我正在尝试弄清楚如何使用计算构建器来表示一组延迟的嵌套步骤。
到目前为止,我有以下内容:
这会产生所需的结构:
我的问题是,在构建结构时,printfn
需要调用。
理想情况下,我想要的是能够检索树结构,但能够调用一些返回的函数,然后执行内部块。
我意识到这意味着如果你有两个嵌套的步骤,它们之间有一些“正常”代码,它需要能够读取步骤声明,然后调用它(如果这有意义的话?)。
我知道这一点,Delay
并且Run
是用于计算表达式的延迟执行的东西,但我不确定它们在这里是否对我有帮助,因为不幸的是它们会评估所有内容。
我很可能遗漏了一些非常明显且非常“实用”的东西,但我似乎无法让它做我想做的事。
澄清
我id
用于演示,它们是拼图的一部分,我想象我可能如何呈现我想要的表达的“可调用”部分。
f# - 无法定义计算表达式自定义“条件”运算符
我很难condition
在以下代码中提出定义。希望有一个例子和见解:
我认为b
是隐含的( fun x, y -> booleanExpr(x, y) )
。该术语booleanExpr(x, y)
只是一些涉及x
and的布尔表达式y
。
f# - 如何构建一个累积的构建器
我想为任一表达式构建一个计算表达式。这很简单
但是在失败(多个)的情况下,我想累积这些并返回一个失败,如下所示。
我对如何通过重写Bind
并始终返回来做到这一点有一个想法Success
(尽管有一些额外的结构表示累积的错误)。但是,如果我这样做,那么我会错过停止信号并且我总是会返回返回值(实际上并不是真的,因为我会遇到运行时异常,但原则上)
f# - 为什么 f# 自定义操作不允许进入控制流语句?
在任何控制流语句中使用 af# 计算表达式的自定义操作都会导致类型检查失败
为什么不允许这样做?不允许重写的自定义操作是什么:
像这样:
algorithm - 重构算法作为计算表达式?
这个问题包含对那些尚未完成Project Euler 问题 61 的人的剧透。我为这个必要的问题写了一个答案,所以我开始做一个更通用、更实用的答案。我成功了,但现在正试图弄清楚如何将其重构为或使用计算表达式,并且感到非常困惑。该问题在下面详细描述,但要点是您正在尝试建立一个数字链,当按顺序排列时,它会在所有相邻对中显示一个属性。每个链的候选者都来自不同的数字池,这意味着蛮力算法必须很聪明,以避免需要搜索所有可能的排列。
我对包含计算表达式的猜测是将搜索算法以某种方式变成一个单子,在那里它继续添加到解决方案中或将空列表转储出去。但我不完全确定。
f# - 嵌套工作流程中的产量问题
我正在尝试编写自己的 Either 构建器,作为我在 f# 中学习计算表达式的一部分,但我认为 Combine 方法存在问题,我遇到了困难。到目前为止我的代码:
使用此代码,我使用两个测试来测试组合:
正如我所料,第一个测试通过,但第二个测试失败并显示以下消息:
抛出异常:nunit.framework.dll 中的“NUnit.Framework.AssertionException”通过嵌套工作流测试/返回成功:失败:预期:
<Success 5>
但是:<Failure>
我不明白。x
没有产生,那么为什么它会影响我的父工作流程?如果我移动让!下面产量测试通过。我盯着我的 Combine 实现,它在我看来,对于Failure*Success
pair,参数的实际顺序不会影响结果,但似乎确实如此
f# - 如何在没有 let 关键字的情况下在计算表达式上调用 bind?
说我有这个:
有没有办法bind
即时“解包”(调用方法)地址和名称?有点像:
(如果 ! 是动态展开的运算符)。每次我想使用bind
一次的结果时都必须声明一个新变量似乎有点冗长。
f# - 用计算表达式避免厄运金字塔?
我遇到了这个关于 F# 中“末日金字塔”的问题。那里接受的答案涉及使用活动模式,但是我的理解是它也可以使用计算表达式来解决。
如何使用计算表达式从此代码中删除“厄运金字塔”?
exception-handling - 如何在 F# 任务计算表达式中的每个步骤上实现非嵌套异常处理?
给定 F#task
计算表达式,我可以编写:-
但我想做的是围绕两个函数调用进行非嵌套异常处理。getBlahAsync
这可以在 C# 中通过async
具有多个await
s 的方法很容易地完成。
如何在 F# 计算表达式中这样做?如果我以简单明了的方式尝试,accessToken
从第一个try..with
不会流入第二个try..with
。
(嵌套的问题是该// do stuff
部分可能会增长一点,将外部推得with
越来越远try
。)
如何在 C# 中做到这一点:-
loops - 在下面的计算表达式中,for/while 不循环
我有以下计算表达式。问题是 For/While 不循环。
我不确定这是“合并”问题还是什么,我非常感谢您的帮助。Helper 函数在 MaybeBuilder 类型中定义:
例如,以下代码产生“j is 1”,就是这样。