在查看F#,Ocaml和其他函数式语言代码示例时,我注意到let关键字经常被使用.
我想了解阴影和嵌套函数的机制是如何工作的.例如:
let func y =
let dup y = y + y
let z = dup y
let dup y =
let dup z =
let y = y * z
y
let z = y
y
dup z + z;;
val func : int -> int
> func 3;;
val it : int = 12
Run Code Online (Sandbox Code Playgroud)
有人可以解释这里发生了什么吗
对我来说,隐藏现有的值,如:
阴影和嵌套函数
在F#
f中不可变#重复定义
FSharp,用于娱乐和利润评论
似乎违背了不变性和类型安全的概念,这使得F#如此强大.F#中的阴影效果与 C#中的不同.我花了很长时间才发现我的代码中的一个错误是由于在同一范围内无意中隐藏了一个名称.有没有办法让VS中的阴影值有编译器警告?
我知道在某些情况下它可能很有用.例如,Checked Aritmetics.
let a = 1
let a = 2
let b = a
Run Code Online (Sandbox Code Playgroud)
这段代码安静地编译、运行和绑定 b = 2。
但这是理想的行为吗?它确实允许编码器重用适当的值名称,没有对象被改变,但是在n行代码中间很容易在同一名称空间中意外再次使用值名称,并且实际上引入了错误通过突变。我想知道这如何符合功能范式,以及是否应该有各种警告。