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

FSharp: Multiple Values with the same name

let a = 1
let a = 2
let b = a

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

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

这是 F# 的预期行为,例如 OCaml。另一方面 Haskell 不允许这样的事情并抛出编译错误。

您并不完全正确,因为这只能在当地实现。

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

这是一个显示阴影的典型用法的示例,其中使用的类型是 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."

PS:F# 也有命令式结构,所以有可能搞砸例如通过混合阴影和可变变量。不要那样做。不过总的来说,有影子是一件幸事。