F# Program.fs中如何对record做shadowing,为何模块级操作报错?
规则差异原因
F#对模块级作用域和局部作用域的变量绑定规则有明确区分:
- 函数、代码块、
do绑定内部属于局部作用域,天然支持变量遮蔽(shadowing),同一作用域内可多次使用let定义同名值,后定义的会直接遮蔽前序同名值,这也是你放在testFunction内的代码可以正常运行的原因。 - 模块作为F#的基础编译单元,默认要求顶级
let绑定名称唯一,不允许重复定义同名值,所以直接在模块下多次声明let home = ...会触发Duplicate definition of value 'home'错误。
示例不生效的背景
你参考的《Get Programming with F#》中的示例,默认是在F#交互(FSI)环境下演示的:交互环境为了方便逐行调试,允许顶级作用域重复定义同名值,规则和普通编译环境的模块级作用域不同,所以没有额外说明作用域限制。
模块级模拟示例的方法
如果你需要在编译环境的模块级运行该示例,可以将代码放到do绑定块内,do块内部属于局部作用域,支持变量遮蔽:
type Address = { Street: string Town: string City: string } // do块是模块的初始化执行块,内部为局部作用域 do let home = { Street = "123 Main Street"; Town = "The Town"; City = "The City" } let home = { home with City = "Second City" } let home = { home with City = "Third City" } printfn "%A" home
内容的提问来源于stack exchange,提问作者CoderLee
相关产品推荐
相关产品推荐

