gpt4 book ai didi

F# 记录 : Fields With Identical Names

转载 作者:行者123 更新时间:2023-12-03 03:32:45 25 4
gpt4 key购买 nike

请考虑以下记录定义:

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 }

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

我能找到的所有例子都说明为什么你必须这样做 a2-way 假设 A 和 B 中的所有字段名称都具有相同的名称 - 这当然是不明确的,但 A 和 B 不应该是当至少有一个不同的字段时可以区分吗?

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

编辑:感谢您的回答,它们帮助我注意到一些相当奇怪的事情:当我第一次评估它时(在 VS 2010 中按 ALT+Enter),整个代码片段都有效。

当我尝试第二次评估时,出现错误。

如果没有人能重现这个,我的 VS 安装可能已经失败了......

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

最佳答案

我不认为你的安装有问题。

第二次计算时代码不起作用,这是有道理的。旧类型 AB 仍然存在,它们只是 shadowed .
另一方面,字段名称永远不会被遮盖。 (否则您永远不可能在两个不同的记录中拥有相同的字段名称。)
“所有可能记录的联合”(参见 Massif 的答案)现在有多个元素:旧的(阴影)A 和新的 A

要解决此问题,您可以在运行之间使用 F# Interactive 上下文菜单中的“重置 session ”。或者将代码包装在模块中(然后旧的记录类型将无法访问,也不在范围内)。

关于F# 记录 : Fields With Identical Names,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5231355/

25 4 0