【问题标题】:FSharp: Multiple Values with the same nameFSharp:具有相同名称的多个值
【发布时间】:2017-04-04 20:07:00
【问题描述】:
let a = 1
let a = 2
let b = a

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

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

【问题讨论】:

  • 正如其他设计指出的值是不可变的,但绑定在 F# 中是可变的。这是一个品味问题。但是,重用变量名的缺点是使代码的可调试性降低,因为调试器是为 C# 设计的(不允许重用),因此只能看到最后一个绑定的值。

标签: .net f# mutation


【解决方案1】:

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

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

这是一个显示阴影的典型用法的示例,其中使用的类型是 Insect option、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# 也有命令式结构,所以有可能搞砸,例如通过混合阴影和可变变量。不要那样做。但总的来说,阴影是一种祝福。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 是的,我曾经使用一种真正的语言并且记得这样的事情是不允许的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 2011-09-16
    • 2012-03-13
    • 2017-04-08
    • 1970-01-01
    • 2022-08-15
    相关资源
    最近更新 更多