Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net FSharp:具有相同名称的多个值_.net_F#_Mutation - Fatal编程技术网

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

.net FSharp:具有相同名称的多个值,.net,f#,mutation,.net,F#,Mutation,这段代码安静地编译、运行和绑定b=2 但这是我们想要的行为吗?它确实允许编码人员重用适当的值名,没有对象发生变异,但是在n行代码中,很容易在同一名称空间中意外地再次使用值名,并且实际上会通过变异引入错误。我想知道这是如何符合功能范式的,以及是否应该有某种警告。这是F#的预期行为,例如OCaml。另一方面,Haskell不允许这样的事情,并抛出一个编译错误 你不是完全正确的,因为这只能在局部实现 这种行为称为阴影。阴影是一种非常有效的方法,可以使代码更具可读性,并且不会像您在使用命令式语言时所认为

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


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

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

你不是完全正确的,因为这只能在局部实现

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

下面是一个显示阴影的典型用法的示例,其中使用的类型有昆虫选项、昆虫和未分类的分区

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

PS:F#也有命令式结构,因此有可能弄糟,例如混合阴影和可变变量。别那么做。但总的来说,阴影是一件好事。

正如设计值所指出的,阴影是不可变的,但绑定在F#中是可变的。这是品味的问题。然而,重用变量名有一个缺点,就是使代码不易调试,因为调试器是为C#(不允许重用)设计的,所以人们只能看到最后一个绑定的值。是的,我曾经使用过一种真正的语言,并且记得这样的事情是不允许的。
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."