gpt4 book ai didi

f# - 有时会出现错误FS0037,非常困惑

转载 作者:行者123 更新时间:2023-12-01 06:10:22 25 4
gpt4 key购买 nike

如果我编写以下 F# 代码,编译器会发出错误。

let a = 123
let a = 123

产生的错误是:

error FS0037: Duplicate definition of value 'a'



如果我在这样的函数中编写相同的代码:
let fctn = 
let a =123
let a =123
a

它不会产生任何错误。

我不明白其中的区别。谁能解释一下?

编辑:我在模块级别编写的第一个代码。

最佳答案

我同意这令人困惑。问题是 let当它用作局部变量(在函数内)和用作全局定义(在模块内)时,行为不同。

全局定义 (在模块中)被编译为静态类的静态成员,因此名称只能使用一次。这意味着顶级使用:

let a = 10
let a = 11

... 是一个错误,因为 F# 必须生成两个同名的静态成员。

本地定义 (在函数或其他嵌套范围内)被编译为 IL 并且变量名基本上消失了(IL 使用堆栈代替)。在这种情况下,F# 允许变量隐藏,您可以隐藏现有名称的变量。这可以在函数内部,甚至只是一个 do堵塞:
do
let a = 10
let a = 11
()

这有点令人困惑,因为变量阴影仅在本地范围内有效,而在顶层无效。但是,当您知道事物是如何编译时,这才有意义..

关于f# - 有时会出现错误FS0037,非常困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36492223/

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