F#记录:具有相同名称的字段

kno*_*tig 8 f#

请考虑以下记录定义:

type A = { F1 : int; F2 : int }
type B = { F1 : int; F3 : int } 

// error FS0656: This record contains fields from inconsistent types   
let a1 = { F1 = 1; F2 = 2 } 

// this works
let a2 = { A.F1 = 1; F2 = 2 }
Run Code Online (Sandbox Code Playgroud)

我不明白,为什么a1会导致错误.

我可以找到为什么你必须这样做的所有例子a2-way假设A和B中的所有字段名都有相同的名字 - 这当然是模棱两可的,但是当A和B不应该有区别时至少有一个不同的领域?

也许这只是F#对此进行评估的方式,将类型名称添加到第一个字段当然没什么大不了的,但我只是好奇.

编辑:感谢您的回答,这让我发现了一些相当奇怪的事情:当我第一次评估它时(ALT +在VS 2010中输入),整个片段都有效.

当我第二次尝试评估时,我收到错误.

如果没有人可以重现这个我的VS安装很可能...

EDIT2(好吧,在这里创建一个帐户的时间,对不起编辑)感谢wmeyer(以及其他所有人)花时间看问题并让我意识到我对FSI如何工作的误解.一切都清理了!

wme*_*yer 6

我不认为你的装置很糟糕.

第二次评估时代码不起作用是有道理的.旧的类型AB仍然存在,他们只是阴影.
另一方面,字段名称永远不会被遮蔽.(否则你永远不会在两个不同的记录中使用相同的字段名.)
"所有可能记录的联合"(参见Massif的答案)现在有多个元素:旧的(阴影)A和新的A.

要解决此问题,可以在运行之间使用F#Interactive上下文菜单中的"重置会话".或者将代码包装在一个模块中(然后旧的记录类型既不可访问也不在范围内).


des*_*sco 5

刚用fsi检查过,这段代码有效

type A = { F1 : int; F2 : int }
type B = { F1 : int; F3 : int } 
let a1 = { F1 = 1; F2 = 2 } 
Run Code Online (Sandbox Code Playgroud)

也许你的帖子中没有提到的其他内容导致这种歧义?