使用带派生类型参数的函数(F#)

时间:2013-08-14 22:38:27

标签: inheritance casting f# code-reuse upcasting

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

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

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

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

现在我意识到,拥有另一个派生自“baseType”的类会更好。 e.g:

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),但我想知道是否还有其他事情可以做。

2 个答案:

答案 0 :(得分:9)

您需要将您的功能注释为接受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!

答案 1 :(得分:3)

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

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

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