F# 具有混合参数化类型的列表

F# 具有混合参数化类型的列表,f#,F#,给定带有类型参数的类型,是否可以创建包含混合混凝土类型值的列表?请参阅下面的代码。在我尝试创建list2之前,所有这些都可以正常工作,其中一些元素的数据为int,而另一些元素的数据为float。有办法做到这一点吗?我在列表3中的尝试未编译 type Holder<'data> = { Data : 'data Name : String } let intVal = {Data = 23; Name = "Bill"} let intVal2 =

给定带有类型参数的类型,是否可以创建包含混合混凝土类型值的列表?请参阅下面的代码。在我尝试创建list2之前,所有这些都可以正常工作,其中一些元素的数据为int,而另一些元素的数据为float。有办法做到这一点吗?我在列表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]

type Holder创建列表时,列表中的元素必须是相同的类型。这意味着您无法创建包含
Holder
Holder
的列表

如果要创建混合类型的列表,可以定义区分的联合:

type Value = 
  | Float of Holder<float>
  | Int of Holder<int>
或者,您可以定义一个接口来捕获两者之间的共性(这里是共享的
名称
属性),并创建接口类型的值列表。在您的示例中,如下所示:

type IHolder = 
  abstract Name : string

type Holder<'data> = 
  { Data : 'data
    Name : string }
  interface IHolder with
    member x.Name = x.Name
接口选项使您可以轻松打印所有名称,但它使访问数据变得困难。使用区分并集,类型更复杂,但您可以在其上进行模式匹配以获得值。

No——F#中的键入系统比C#更强。您必须使用[float intVal;floatVal]。
type IHolder = 
  abstract Name : string

type Holder<'data> = 
  { Data : 'data
    Name : string }
  interface IHolder with
    member x.Name = x.Name
let list = [intVal :> IHolder; floatVal :> IHolder]
for h in list do printfn "%s" h.Name