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 }

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 },f#,F#,我不明白为什么a1会导致错误 我能找到的所有例子都假设A和B中的所有字段名都具有相同的名称,这当然是不明确的,但当至少有一个不同的字段时,A和B不应该是可区分的吗 也许这只是F#求值的方式,将类型名称添加到第一个字段当然没什么大不了的,但我只是好奇 编辑: 谢谢你的回答,这让我注意到了一件相当奇怪的事情:当我第一次评估它时,整个代码段都很有效(在VS2010中ALT+Enter) 当我第二次尝试求值时,我得到了错误 如果没有人能复制这一点,我的VS安装可能已经损坏了 EDIT2(好的,是时候在这

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

我能找到的所有例子都假设A和B中的所有字段名都具有相同的名称,这当然是不明确的,但当至少有一个不同的字段时,A和B不应该是可区分的吗

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

编辑: 谢谢你的回答,这让我注意到了一件相当奇怪的事情:当我第一次评估它时,整个代码段都很有效(在VS2010中ALT+Enter)

当我第二次尝试求值时,我得到了错误

如果没有人能复制这一点,我的VS安装可能已经损坏了

EDIT2(好的,是时候在这里创建一个帐户了,很抱歉进行了编辑)
感谢wmeyer(和其他人)花时间研究这个问题,让我意识到我对FSI工作原理的误解。现在一切都好了

刚刚通过fsi检查,此代码有效

type A = { F1 : int; F2 : int }
type B = { F1 : int; F3 : int } 
let a1 = { F1 = 1; F2 = 2 } 

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

事实上,它听起来确实应该起作用——来自:

如果字段labeli不是单个 标识符或初始类型是 变量类型,则字段标签为 通过执行字段标签来解决 决议(见§14.1) 字段labeli,它将生成一个集合 FSeti的字段。每个元素 集合具有相应的记录类型, 产生一组记录类型 塞蒂。所有RSeti的交点 必须给出一个记录类型R,并且 然后,每个字段解析为 R中的对应字段


这意味着只要包含这些字段标识符的所有可能记录的联合分解为一种记录类型,那么它就是合法的。你在用什么编译器?

我认为你的安装没有问题

第二次求值时代码不工作是有道理的。旧类型的
A
B
仍然存在,它们只是。
另一方面,字段名从不隐藏。(否则,在两个不同的记录中不能有相同的字段名。)
“所有可能记录的联合”(参见Massif的答案)现在有不止一个元素:旧的(阴影)
A
和新的
A

要解决此问题,您可以在运行之间使用F#交互式上下文菜单中的“重置会话”。或者将代码包装在模块中(这样旧的记录类型既不可访问,也不在范围内)