问题标签 [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# - 让机制!在计算表达式中
我目前正在研究 fsharpforfunandprofit 网站的计算表达式系列,我对计算系列的第 4 课“包装类型”有疑问。我已经尝试进一步阅读,但有一个重要的概念我没有掌握。
实际上,我确实了解 bind 的定义:
但在这一点上我不明白的一件事是在 let! 的计算表达式中使用它时的魔力:
例如在:
getCustomerId "Alice"把M<'T>还给我,但custId 已经是未包装的 'T,我在任何地方都看不到这个魔术是如何工作的......
它是隐藏在 let! 中的代码的一部分吗?Fsharp 核心程序集中的指令?有人可以向我解释一下如何让!把 T' 从它的包装里拿出来?
谢谢你的解释
f# - 使用 Bind 传递 F# 计算表达式透明状态
我有以下代码尝试使用通常的 MaybeBuilder 从网络流中读取可能不完整的数据(例如图像数据):
因此,如果数据尚未到达 NetworkStream,readStream[asInt] [numBytes] [offset] 函数将返回 Some [data] 或 None。AdvanceInStream 函数在读取整个网络数据包时执行。
我想知道是否有某种方法可以编写一些自定义计算表达式构建器来隐藏从其用户传递的 pos,因为它总是相同的 - 我在流中读取一些数据和位置并将其作为最后一个参数传递给下一个读取函数。
PS MaybeBuilder 使用:
聚苯乙烯
再想一想,似乎我必须使 pos 可变,因为阅读中可能出现“for”或“while”循环。简单让!使用 pos Bind 阴影效果很好,但是如果你在循环中添加阅读,你就不能保持不变性,对吧?任务变得微不足道。
f# - 在绑定中获取 f 的属性
我在工作流程中有一些代码,我想在其中获取函数的属性
表达是这样的
在我的绑定中,我有这个
思路是获取函数_accounts()的属性。但是 f 代表 countinuation 而不是 _accounts ,所以无论如何我可以获得被调用函数的属性?
f# - 使用计算表达式组合引用函数
我环顾四周,努力寻找答案;我确信有一个明显的答案,但我似乎无法找到它;或者我遇到了与计算表达式一起使用时无法通过的引用限制。
基本上,我想使用计算 F# 工作流来使用如下定义的引用 lambda。尝试将这些工作流程组合在一起时会出现问题。理想情况下,我想使用 let 组合 Workflow<'Env, 'Result> 实例!句法。我有点幼稚的尝试如下:
第三个绑定成员给了我编译器错误:“变量“env”被绑定在引号中,但在切片表达式中使用”这有点道理。问题是我如何绕过它。我已将上述定义为尝试使以下简单案例起作用的尝试。
只是想知道我想要实现的目标是可能的还是我做错了什么?在最终引用的表达式中捕获用户函数时,是否可以使上述简单案例起作用?
编辑:考虑到 Tomas 的回答,我也尝试过不使用 WorkflowSource 类型。没有运气仍然有错误:System.InvalidOperationException:Microsoft.FSharp.Core.ExtraTopLevelOperators.SpliceExpression[T](FSharpExpr`1 表达式) 不允许第一类使用“%”或“%%”
f# - Using custom computation expression operator inside match statement
Right now I'm experimenting with F# computation expressions. General idea is to return control mechanism to drive actions executed after each step of recursive function call build from computation expression. Whole example can be seen here.
Using following example:
Unfortunately this ends with compile time error on unhandled
: A custom operation may not be used in conjunction with 'use', 'try/with', 'try/finally', 'if/then/else' or 'match' operators within this computation expression.
Is it possible in any way to use custom operators inside match statements?
f# - F# 查询表达式产生
我正在学习F#
,现在正在阅读有关与 SQL 类型提供程序一起使用的计算表达式和查询表达式的信息。我正在做一些简单的任务,并且在某些时候需要连接(联合)2个查询,我的第一个想法是,在阅读了yield
序列和列表之后,在这样的查询表达式中做同样的事情:
这是无效的代码,然后我的第二种方法是使用以下方法“连接”它们:
或者像这样使用 Linq 的Concat
函数(query {...}).Concat(query {...})
:如何做到这一点来自这个问题的答案
不过,上述两种方法都有一个区别,使用seq
将运行 2 个 SQL 查询,并且Concat
只运行一个可以理解的查询。
那么我的问题是:为什么不yield
支持查询表达式?
编辑:
经过进一步调查,我找到了MSDN 文档,我看到了实现的Yield
andYieldFrom
方法,但没有看到Combine
andDelay
方法,这让我现在更加困惑
f# - 计算表达式中的归零和合并
我有以下计算表达式生成器:
我了解方法Return、Zero和Combine的目的,但我不明白下面显示的表达式之间有什么区别:
我也不明白为什么在第一种情况下, printfn语句不需要零方法?
f# - F#“提前退出”计算表达式?
在尝试了解有关计算表达式如何工作的更多信息时,我正在尝试编写一个构建器,该构建器在评估语句then
块后跳过表达式的其余部分if
,因此工作流本身将评估为true
. false
如果没有任何if
语句评估为,则工作流应返回true
。
例如:
在这里,result
应该是true
,而且x
应该是33
。
我得到的最接近的是:
...这导致工作流评估为false
和。x
11
使用我的示例中的语法是否可行?
.net - 在自定义计算表达式中实现绑定
我试图通过实现我自己的一个来更多地了解 F# 的计算表达式。Bind
但是,我遇到了与该方法相关的绊脚石。这是我到目前为止所得到的:
现在,我的理解是以下所有内容应该大致等效:
前 3 个似乎工作正常,但是,f4
给出了这个错误:
这个表达式应该有
单位类型
,但这里有
int类型
如果我使用let
而不是let!
. 我读过的所有内容都表明这是实现的正确方法Bind
,但显然我遗漏了一些东西。谁能指出我做错了什么?
f# - 计算表达式是面向方面编程的替代方法吗?
计算表达式是面向方面编程的替代方法吗?
这是 F# 管理横切关注点的解决方案吗?
看了下面的文章,忍不住想到了AOP(即面向切面编程)。
在文章中,作者提供了一个处理日志的计算表达式的示例,但在不混淆业务逻辑的主要意图的情况下隔离了代码的实际日志方面。
我的想法准确吗?