gpt4 book ai didi

f# - 计算表达式不执行 Let

转载 作者:行者123 更新时间:2023-12-01 13:08:51 25 4
gpt4 key购买 nike

我使用的是 F# v 1.9.6.2,我定义了一个非常简单的计算表达式:

type MaybeBuilder() =
member this.Let(x, f) =
printfn "this.Let: %A" x
this.Bind(Some x, f)
member this.Bind(x, f) =
printfn "this.Bind: %A" x
match x with
| Some(x) when x >= 0 && x <= 100 -> f(x)
| _ -> None
member this.Delay(f) = f()
member this.Return(x) = Some x

let maybe = MaybeBuilder()

我在代码中添加了一些打印语句来告诉我在计算表达式中调用了哪些方法。当我执行以下语句时:

maybe {
let x = 12
let! y = Some 11
let! z = Some 30
return x + y + z
}

我希望控制台打印出以下内容:

this.Let 12this.Bind Some 12this.Bind Some 11this.Bind Some 30

但我的实际结果如下:

this.Bind: Some 11this.Bind: Some 30

换句话说,F# 似乎没有执行 Let 成员。当我重写 Let 抛出异常时,代码运行没有异常。此外,当我完全注释掉 Let 成员时,我没有收到一条错误消息,指出 The field, constructor or member 'Let' is not defined,代码按预期执行。

(我曾尝试使用 Reflector 调查代码,但通常情况下,反编译的 F# 被破坏得无法阅读。)

它看起来像 spec for computation expressions已经改变。 let 绑定(bind)是否不再被视为语法糖,计算工作流中是否不再需要 Let 成员?

最佳答案

您自己就有了答案。来自F# spec描述了如何翻译计算表达式:

{| let binds in cexpr |}C  = let binds in {| cexpr |}C)

所以不,你不需要再显式定义 let,它由编译器翻译。

更新:此更改在 the detailed release notes of the September CTP 中提到.

关于f# - 计算表达式不执行 Let,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/715707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com