我的应用程序中有一个类-为了简单起见,我们假设它是这样定义的:
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)映射我的数组,但我想知道是否还有其他方法可以做。
您需要将函数注释为接受灵活类型。
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!
您还可以使用类型注释用子类型B
的实例填充A
的数组
let bArr: A[] = [| B() |]
这对于一次性使用或函数在第三方库中时可能很有用。另一种常见用法是创建盒装阵列(obj[]
)。