F#是否具有行多态(或类似的东西?)

wye*_*r33 2 .net f# ocaml f#-3.0

F#是否有行多态或类似的东西?具体来说,在OCaml中,我们可以编写一个类似的函数

# let foo x = x#num+2;;
val foo : < num : int; .. > -> int = <fun>
Run Code Online (Sandbox Code Playgroud)

基本上,该函数foo可以接受包含num类型方法的任何对象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
Run Code Online (Sandbox Code Playgroud)

其原因是,即使我们可以使用类型的对象foo1foo2内部f,我们失去了他们的其他成员访问,charstring分别.为了重新获得这些信息,我们必须采用双重调度技巧,例如访问者模式,我试图避免这种情况.基本上,我试图得到像行多态而不是子类型的东西.

Rob*_*sen 7

这是一种方法:

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