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