在函数内取消引用 ref 会产生不同的结果。为什么?

发布于 2024-11-08 11:40:41 字数 444 浏览 0 评论 0原文

在此示例中,正在急切地评估 get_final_answer,并且始终返回 0.0。我认为包含 refs 的表达式由于其固有的可变特性而受到不同的对待(在这种情况下不会急于评估)。我预计它会返回7.0。

let FinalAnswer = ref 0.0
let get_final_answer = !FinalAnswer

let rec eval_expr_fail =
        FinalAnswer := 7.0
        get_final_answer        // fails, returns 0.0

let rec eval_expr_works =
        FinalAnswer := 7.0
        !FinalAnswer           // works, return 7.0

如何在更新的块之外取消引用 FinalAnswer?

In this sample, get_final_answer is being eagerly evaluated, and always returns 0.0. I thought expressions containing refs were treated differently (and not eagerly evaluated in this case) due to their inherently mutable characteristics. I expected it to return 7.0.

let FinalAnswer = ref 0.0
let get_final_answer = !FinalAnswer

let rec eval_expr_fail =
        FinalAnswer := 7.0
        get_final_answer        // fails, returns 0.0

let rec eval_expr_works =
        FinalAnswer := 7.0
        !FinalAnswer           // works, return 7.0

How do I dereference FinalAnswer outside the block where I updated it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

哆兒滾 2024-11-15 11:40:41

let get_final_answer = !FinalAnswer 中的 get_final_answer 是浮点值,而不是函数。它的值为0.0,一旦赋值就与FinalAnswer无关。

将其作为一个函数得到你想要的:

let FinalAnswer = ref 0.0
let get_final_answer() = !FinalAnswer

let rec eval_expr_fail =
        FinalAnswer := 7.0
        get_final_answer ()       //  returns 7.0

get_final_answer in let get_final_answer = !FinalAnswer is a float value, not a function. It is the value of 0.0, and has nothing to do with FinalAnswer once the value is assigned.

Making it as a function gets what you want:

let FinalAnswer = ref 0.0
let get_final_answer() = !FinalAnswer

let rec eval_expr_fail =
        FinalAnswer := 7.0
        get_final_answer ()       //  returns 7.0
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文