【发布时间】:2015-03-05 21:02:02
【问题描述】:
此示例代码:
type recordA = { X: string; }
type recordB = { X: string; }
let modifyX newX record = { record with X = newX }
let modifiedRecordA = {recordA.X = "X"} |> modifyX "X2"
let modifiedRecordB = {recordB.X = "X"} |> modifyX "X2"
结果:
let modifyX newX record = { record with X = newX }
--------------------------^^^^^^^^^^^^^^^^^^^^^^^^
stdin(4,27): warning FS0667: The field labels and expected type of this record expression or pattern do not uniquely determine a corresponding record type
let modifiedRecordA = {recordA.X = "X"} |> modifyX "X2"
-------------------------------------------^^^^^^^^^^^^
stdin(6,44): error FS0001: Type mismatch. Expecting a
recordA -> 'a
but given a
recordB -> recordB
The type 'recordA' does not match the type 'recordB'
我的期望是 modifiedRecordA 最终等同于 { recordA.X = "X2" } 并且 modifiedRecordB 最终等同于 { recordB.X = "X2" },但它似乎不是那样工作的。
- 为什么这不只是根据参数类型推断并返回适当的记录类型?
- 我能做些什么来完成这项工作吗?
【问题讨论】:
-
记录并没有真正做继承。使用一些内联魔法或许可以做到这一点,但您可能需要重新考虑您的设计。