我想我不太明白 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://lorgonblog.wordpress.com/2009/10/25/overview-of-type-inference-in-f/
但是我没有发现任何有用的...
提前感谢您提供的任何答案:)