我想我不太明白 F# 如何推断序列表达式中的类型,以及为什么即使我直接从“seq”指定元素的类型也无法正确识别类型。
在以下 F# 代码中,我们有一个基类 A 和两个派生类 B 和 C:
type A(x) =
member a.X = x
type B(x) =
inherit A(x)
type C(x) =
inherit A(x)
如果我尝试在简单的序列表达式中“生成”它们的实例,则会出现两个错误:
// Doesn't work, but it makes sense.
let testSeq = seq {
yield A(0)
yield B(1) // Error, expected type: A
yield C(2) // Error, expected type: A
}
这是有道理的,因为推断“常见”类型可能并不是那么简单(我认为,接口可以使这项工作变得更加困难)。但是,这些错误可以通过安全转换来修复:
// Works fine :)
let testSeqWithCast = seq {
yield A(0)
yield B(1) :> A
yield C(2) :> A
}
如果我不想使用强制转换怎么办?我尝试直接从“seq”指定序列类型,但事情似乎不起作用:
// Should work, I think...
let testGenSeq = seq<A> {
yield A(0)
yield B(1) // Error, expected type: A
yield C(2)
}
所以,我的问题是:有没有办法避免强制转换?如果不是,是否有原因导致即使指定类型也无法使代码正常工作?
我尝试通过以下链接进行挖掘:
http://msdn.microsoft.com/en-us/library/dd233209.aspx http://msdn.microsoft.com/en-us/library/dd233209.aspx
http://lorgonblog.wordpress.com/2009/10/25/overview-of-type-inference-in-f/ http://lorgonblog.wordpress.com/2009/10/25/overview-of-type-inference-in-f/
但我发现没有什么有用的...
预先感谢您提供的任何类型的答案:)