F# がシーケンス式の型をどのように推論するのか、また、「seq」から要素の型を直接指定しても型が正しく認識されない理由がよくわかっていないと思います。
次の F# コードには、基本クラス A と 2 つの派生クラス B と C があります。
type A(x) =
member a.X = x
type B(x) =
inherit A(x)
type C(x) =
inherit A(x)
単純なシーケンス式でそれらのインスタンスを「生成」しようとすると、次の 2 つのエラーが発生します。
// 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/
しかし、私は何も役に立たなかった...
あなたが与えることができるあらゆる種類の答えを前もってありがとう:)