【发布时间】:2015-04-09 07:00:36
【问题描述】:
F# 是否具有行多态性或类似的东西?具体来说,在 OCaml 中,我们可以写一个类似的函数
# let foo x = x#num+2;;
val foo : < num : int; .. > -> int = <fun>
基本上,函数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
原因是即使我们可以在f 中使用foo1 和foo2 类型的对象,我们也无法分别访问它们的其他成员char 和string。为了重新获得这些信息,我们必须使用双重调度技巧,例如访问者模式,我正在努力避免这种情况。基本上,我试图获得类似行多态性而不是子类型的东西。
【问题讨论】:
-
有类似的东西 see here under explicit member constraint 但通常你会想要使用惯用的 F# IMO 的界面