F#是否具有行多态性或类似的东西?具体来说,在OCaml中,我们可以编写如下函数
# let foo x = x#num+2;;
val foo : < num : int; .. > -> int = <fun>
基本上,该函数foo
可以接受任何包含num
type方法的对象int
。我不确定如何在F#中执行类似的操作。如果可能,我想避免通过继承进行显式子类型化。具体来说,我不是在寻找这样的东西:
[<AutoOpen>]
module Foo
[<AbstractClass>]
type foo() =
abstract member num : int
type foo1() =
inherit foo()
override this.num = 2
member this.char = 'a'
type foo2() =
inherit foo()
override this.num = 3
member this.string = "abbacadabba"
let f (x:foo) = x.num + 2
其原因是,即使我们可以使用类型的对象foo1
和foo2
内部f
,我们无法访问他们的其他成员,char
并string
分别。为了重新获得此信息,我们必须采取双重调度技巧,例如使用访客模式,而我正努力避免这种情况。基本上,我正在尝试获得诸如行多态性之类的东西,而不是子类型化。
这是一种实现方法:
let inline foo (a: ^a) =
let x = (^a : (member num: int) (a))
x + 2
type monkey() =
member x.num = 2
type pig() =
member x.num = 3
let x = monkey()
let y = pig()
foo x // = 2+2=4
foo y // = 3+2=5
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句