【发布时间】:2023-03-09 10:56:01
【问题描述】:
我有 2 种具有相同签名的记录类型:
type T1 = { a : int }
type T2 = { a : int }
let badFunc record = { record with a = 0 }
let goodFunc (record : T2) = { record with a = 0 }
编译器会在badFunc函数中抛出警告:
此记录表达式或模式的字段标签和预期类型不能唯一确定对应的记录。
来自F# RFC FS-1025 - Improve record type inference:
解析记录类型时,编译器的当前行为是为记录类型的每个字段查找范围内具有该字段的所有类型。然后它为所有字段获取这些类型的交集,如果找到一个匹配的类型,则选择该类型。否则,会盲目选择列表中的第一个类型,从而导致错误。
所以 F# 应该知道 badFunc 类型是 T2 -> T2,为什么 F# 会忽略阴影并抛出警告?
【问题讨论】:
-
对不起,我看不出 F sharp 应该如何知道 badFunc 中的记录类型
-
@flq 如果
T2在T1之后声明,为什么不应该选择它? -
类型
T2不影响T1,所以类型不明确。
标签: .net f# functional-programming record