2016-09-03 16 views
4

型パラメータを持つ型を指定すると、コンクリート型を混在させた値を含むリストを作成できますか?以下のコードを参照してください。リスト2を作成しようとするまでは、すべてうまく動作します。リスト2では、いくつかの要素にデータ用のintがあり、他の要素には浮動小数点があります。これを行う方法はありますか?リスト3の私の試みはコンパイルされません。混合パラメータ化タイプのリスト

type Holder<'data> = { 
    Data : 'data 
    Name : String 
} 

let intVal = 
    {Data = 23; 
    Name = "Bill"} 

let intVal2 = 
    {Data = 29; 
    Name = "Cindy"} 

let floatVal = 
    {Data = 23.0; 
    Name = "John"} 

let list1 = [intVal; intVal2] 
let list2 = [intVal; floatVal] 
let list3 : Holder<'a> list = [intVal; floatVal] 
+0

いいえ - F#のタイピングシステムはC#より強力です。あなたは[float intVal; floatVal]。 –

答えて

6

リストを作成する場合、リストの要素は同じタイプでなければなりません。つまり、Holder<int>Holder<float>を含むリストを作成することはできません。

あなたは混合型のリストを作成したい場合は、あなたが差別組合を定義することができ、次のいずれか

type Value = 
    | Float of Holder<float> 
    | Int of Holder<int> 

をと使用タイプValueのリストを作成します。

let list = [Int intVal; Float floatVal] 

または定義することができますが2つの共通部分(ここでは共通のNameプロパティ)をキャプチャし、インターフェイスタイプの値のリストを作成するインターフェイスです。

type IHolder = 
    abstract Name : string 

type Holder<'data> = 
    { Data : 'data 
    Name : string } 
    interface IHolder with 
    member x.Name = x.Name 

IHolderインスタンスに変換Holder<_>値のリストを作成します。次のようにあなたの例では、これはなり

let list = [intVal :> IHolder; floatVal :> IHolder] 
for h in list do printfn "%s" h.Name 

インターフェースオプションを使用すると、簡単にすべての名前を印刷することができますが、それはしにくいことになりますデータにアクセスします。差別化された和集合では、型はより複雑ですが、パターンを照合して値を取得することができます。

関連する問題