6

我的应用程序中有一个类 - 为简单起见,我们假设它是这样定义的:

type baseType() =
    member this.A = 5.

此外,我有很多函数将这种类型的对象作为参数。此外,其中一些采用这种类型的数组:

let myFun (xArr : baseType[]) =
    // ... do something inspirig ;)

现在我意识到,拥有另一个派生自“baseType”的类会很好。例如:

type inhType() =
    inherit baseType()
    member this.B = 8.

但是,我不能将继承类型的数组与“myFun”等函数一起使用

let baseArr = [| baseType() |]
let inhArr = [| inhType() |]

myFun baseArr
myFun inhArr // won't work

这将是“很高兴”。有没有一种简单的方法可以重用我的功能而无需进行太多更改?

我想解决方案之一是使用例如函数 (fun (d : inhType) -> d :> baseType) 映射我的数组,但我想知道是否还有其他事情可以做。

4

2 回答 2

10

You need to annotate your function as accepting a flexible type.

type A() = class end
type B() = inherit A()

let aArr = [| A() |]
let bArr = [| B() |]

// put # before type to indicate it's a flexible type
let f (x : #A[]) = ()

f aArr
f bArr  // works!
于 2013-08-14T23:22:12.510 回答
3

您还可以使用类型注释填充A子类型实例的数组:B

let bArr: A[] = [| B() |]

这对于一次性使用或该函数在第三方库中可能很有用。另一个常见的用法是创建盒装数组 ( obj[])。

于 2013-08-15T14:23:30.467 回答