f# - 为什么这个 F# 引用在运行时失败?
问题描述
我试图理解为什么这个 F# 脚本在运行时失败。
#r "nuget: FsToolkit.ErrorHandling, 2.2.0"
open System
open FsToolkit.ErrorHandling
<@@ async {
return!
asyncResult {
return! (Result.Ok true)
}
} @@>
错误:
$ dotnet fsi ./Quotations.fsx
System.InvalidOperationException: Could not bind function AsyncResultBuilder.Source in type FsToolkit.ErrorHandling.AsyncResultCEExtensions
at Microsoft.FSharp.Quotations.PatternsModule.fail@1118[a](Type ty, String nm, Unit unitVar0) in F:\workspace\_work\1\s\src\fsharp\FSharp.Core\quotations.fs:line 1118
at Microsoft.FSharp.Quotations.PatternsModule.bindModuleFunctionWithCallSiteArgs$cont@1110(Type ty, String nm, Type[] argTypes, Type[] tyArgs, Unit unitVar) in F:\workspace\_work\1\s\src\fsharp\FSharp.Core\quotations.fs:line 1169
at Microsoft.FSharp.Quotations.PatternsModule.bindModuleFunctionWithCallSiteArgs(Type ty, String nm, FSharpList`1 argTypes, FSharpList`1 tyArgs) in F:\workspace\_work\1\s\src\fsharp\FSharp.Core\quotations.fs:line 1105
at Microsoft.FSharp.Quotations.PatternsModule.u_ModuleDefn@1572-1.Invoke(FSharpList`1 argTypes, FSharpList`1 tyargs) in F:\workspace\_work\1\s\src\fsharp\FSharp.Core\quotations.fs:line 1576
at Microsoft.FSharp.Quotations.PatternsModule.u_constSpec@1636.Invoke(FSharpList`1 argTypes, FSharpList`1 tyargs) in F:\workspace\_work\1\s\src\fsharp\FSharp.Core\quotations.fs:line 1636
at Microsoft.FSharp.Quotations.PatternsModule.u_Expr@1492.Invoke(BindingEnv env) in F:\workspace\_work\1\s\src\fsharp\FSharp.Core\quotations.fs:line 1501
at Microsoft.FSharp.Primitives.Basics.List.mapToFreshConsTail[a,b](FSharpList`1 cons, FSharpFunc`2 f, FSharpList`1 x) in F:\workspace\_work\1\s\src\fsharp\FSharp.Core\local.fs:line 239
at Microsoft.FSharp.Primitives.Basics.List.map[T,TResult](FSharpFunc`2 mapping, FSharpList`1 x) in F:\workspace\_work\1\s\src\fsharp\FSharp.Core\local.fs:line 247
at Microsoft.FSharp.Quotations.PatternsModule.u_Expr@1492.Invoke(BindingEnv env) in F:\workspace\_work\1\s\src\fsharp\FSharp.Core\quotations.fs:line 1493
at Microsoft.FSharp.Quotations.PatternsModule.u_Expr@1508-2.Invoke(BindingEnv env) in F:\workspace\_work\1\s\src\fsharp\FSharp.Core\quotations.fs:line 1508
at Microsoft.FSharp.Primitives.Basics.List.mapToFreshConsTail[a,b](FSharpList`1 cons, FSharpFunc`2 f, FSharpList`1 x) in F:\workspace\_work\1\s\src\fsharp\FSharp.Core\local.fs:line 239
at Microsoft.FSharp.Primitives.Basics.List.map[T,TResult](FSharpFunc`2 mapping, FSharpList`1 x) in F:\workspace\_work\1\s\src\fsharp\FSharp.Core\local.fs:line 247
...
这是 F# 引用的问题吗?还是FsToolkit.ErrorHandling
包裹?
请解释错误信息及其发生原因。
解决方案
正如上面的答案所述,它可能是由于报价中的过载解决而发生的。但是您可以通过将 builder 包装在一个函数中来解决这个问题,然后将其传递给一个引号:
let returnResult =
asyncResult {
return! (Result.Ok true)
}
let quotation =
<@@
async {
return! returnResult
}
@@>
...
这里returnResult
将是一个返回的ValueOp
内部。ValueWithName
returnResult
FSharpFunc
推荐阅读
- python - ax.set_xlabel 和 ax.set_ylabel 不适用于熊猫图
- angular-forms - 如何使用 Angular 8 创建可重用的复选框组件?
- typescript - Phaser 3 typescript player.alive 未定义
- google-cloud-storage - GCS 存储创建文件夹 API
- android-studio - 来自 git 的一些旧项目的问题同步 gradle
- java - sftp二次开发如何使用guacamole
- python - 比较两个不同数据框的两列并使用 If 条件创建新列
- jquery - .Closest() with Classes 似乎没有选择正确的元素
- android - 在 iOS 的 UITextView 上加载 html 字体的问题
- android - 如何使用 TypeConverter 将 Joda-Time Period 字段保存到 Room 中?