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

Alo*_*zcz 6 inheritance code-reuse f# casting upcasting

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

type baseType() =
    member this.A = 5.
Run Code Online (Sandbox Code Playgroud)

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

let myFun (xArr : baseType[]) =
    // ... do something inspirig ;)
Run Code Online (Sandbox Code Playgroud)

现在我意识到,拥有另一个派生自"baseType"的类会更好.例如:

type inhType() =
    inherit baseType()
    member this.B = 8.
Run Code Online (Sandbox Code Playgroud)

但是,我不能使用像"myFun"这样的函数继承类型的数组

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

myFun baseArr
myFun inhArr // won't work
Run Code Online (Sandbox Code Playgroud)

这将是"很高兴".是否有一种简单的方法可以在不应用如此多更改的情况下重复使用我的功能?

我猜其中一个解决方案是使用例如函数(fun(d:inhType) - > d:> baseType)来映射我的数组,但我想知道是否还有其他任何事情可以完成.

lat*_*kin 9

您需要将您的函数注释为接受灵活类型.

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!
Run Code Online (Sandbox Code Playgroud)