Generics 如何为某些类型通用的几个接口编写包装器类型

Generics 如何为某些类型通用的几个接口编写包装器类型,generics,f#,Generics,F#,我想为不同类型编写一些通用代码,并为其创建一个基类型。它的类型实现了一些通用代码需要的接口。这是一种方式还是不适合f#型模型 type IInterface1 = abstract member id :string type IInterface2 = abstract member weight :float type A (id, weight) = interface IInterface1 with member x.id = id interfa

我想为不同类型编写一些通用代码,并为其创建一个基类型。它的类型实现了一些通用代码需要的接口。这是一种方式还是不适合f#型模型

type IInterface1 =
    abstract member id :string

type IInterface2 = 
    abstract member weight :float

type A (id, weight) =
    interface IInterface1 with member x.id = id
    interface IInterface2 with member x.weight = weight

type B (id, weight) =
    interface IInterface1 with member x.id = id
    interface IInterface2 with member x.weight = weight

type Common<'T when 'T :> IInterface1 and 'T :> IInterface2> (o :'T) =
    interface IInterface1 with member x.id = o.id
    interface IInterface2 with member x.weight = o.weight

type LBranch<'T> (root :'T) =
    member val root = root
    member val branch = [root] :'T list with get, set
    member x.add item = x.branch <- item :: x.branch; x
    member x.head = match x.branch with h :: _ -> h | _ -> failwith "LevelingTree corrupt"

let a, b = A("1", 10.0), B("2", 100.0)
let ca, cb = Common(a), Common(b)
LBranch(ca).add(cb) // Common<B> is not compatible with Common<A>

一个真正简单的解决方案是让复杂接口继承基本接口,即

type IInterface1 =
    abstract member id :string

type IInterface2 = 
    abstract member weight :float

type ICommon =
    inherit IInterface1
    inherit IInterface2
另见

type IInterface1 =
    abstract member id :string

type IInterface2 = 
    abstract member weight :float

type ICommon =
    inherit IInterface1
    inherit IInterface2