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

时间:2017-04-04 20:07:01

标签: .net f# mutation

.page-id-1973 #logo {content: url(http://example.com/wp-content/uploads/2017/04/new-logo.png) ;}

此代码安静地编译,运行并绑定b = 2。

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

2 个答案:

答案 0 :(得分:4)

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

此行为称为阴影。阴影是一种非常有效的方法,可以使代码更具可读性,并且如果习惯于命令式语言,也可以像你想象的那样易于理解。它实际上可以帮助防止错误,而不是通过覆盖标识符名称来引入错误,从而阻止访问前一个定义。

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

答案 1 :(得分:3)

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