有没有办法正确抑制 F# 类型约束警告?

Is there a way to correctly suppress an F# Type Constraint Warning?

我有一个设计明确定义的类型约束,用于我打算使用具有相应 List/Collection 类型的类型的一组函数。即使我实际上定义了约束,它仍然给我一个我无法删除的警告。这并不重要,但我真的非常努力地处理所有警告,而无法清除列表有点烦人。

let domainValue (domain:'Domain when 'Domain :> 'ItemDomain list) //Address Type Constraint Warning ?
            : Value<'ItemDomain,'Domain> = (domain, (domain |> validDomainResult |> Some)) ||> value

你的约束是说参数应该是一个类型 'Domain 使得 'Domain :> list<'ItemDomain>,即以 list<'ItemDomain> 作为基础的类型 class。

但是,list<'T> 是一个密封的 class,因此除了 list<'ItemDomain> 之外没有其他类型可以满足约束 - 唯一满足约束的类型是 list<'ItemDomain> 所以你也可以简化类型声明并使用:

let domainValue (domain:list<'ItemDomain>) = ...

值得注意的是,对于像 seq<'T> 这样的接口,情况并非如此,因此以下不会给出错误:

let domainValue (domain:'Domain when 'Domain :> seq<'ItemDomain>) = ...

这将允许参数是任何类型的 'ItemDomain 值集合,包括数组、列表等。此外,您可以使用 # 类型更简洁地编写相同的约束,这意味着同样的事情:

let domainValue (domain:#seq<'ItemDomain>) = ...