FSharp:具有相同名称的多个值

lau*_*n91 2 .net f# mutation

let a = 1
let a = 2
let b = a
Run Code Online (Sandbox Code Playgroud)

这段代码安静地编译、运行和绑定 b = 2。

但这是理想的行为吗?它确实允许编码器重用适当的值名称,没有对象被改变,但是在n行代码中间很容易在同一名称空间中意外再次使用值名称,并且实际上引入了错误通过突变。我想知道这如何符合功能范式,以及是否应该有各种警告。

Ben*_*erg 5

您并不完全正确,因为这只能在本地进行。

这种行为称为阴影。阴影是一种非常有效的方法,可以使代码更具可读性,而不是像您在使用命令式语言时可能认为的那样难以理解。它实际上可以通过覆盖标识符名称来帮助防止错误而不是引入错误,从而阻止访问以前的定义。

下面是一个示例,显示了阴影的典型用法,其中使用的类型是 Insect 选项、Insect 和 UnclassifiedInsect。

match insect with
| Some insect ->
    match insect with
    | Butterfly butterfly -> printfn "It's a butterfly."
    | UnclassifiedInsect insect -> printfn "New species? %A." insect
| None -> printfn "There was no insect."
Run Code Online (Sandbox Code Playgroud)

PS:F# 也有命令式结构,所以有可能搞砸,例如混合阴影和可变变量。不要那样做。但总的来说,阴影是一种祝福。