F#:成员约束有助于创建看似动态的类型

Pro*_*ool 3 generics f# generic-constraints

我一直在寻找一种方法来为F#方法添加一些鸭子类型.

SomeMethod(model:'a) =
   let someField = model.Test("")
Run Code Online (Sandbox Code Playgroud)

进来的参数有Test方法.我看过这样的符号:

member inline public x.Testing< ^a when ^a : (member public Test : String-> String)>(model:^a) =   
  let something = model.Test("")
  ignore
Run Code Online (Sandbox Code Playgroud)

对我来说,通用约束可以用于方法级别而不是类/接口级别.问题是由于类型问题我无法编译它.这让我相信没有办法在方法级别指定约束.这是coorect?

Dan*_*iel 5

这个语法有点笨拙,但现在就是这样.

type Foo() =
  member inline public x.Testing(model) =   
    let something = (^a : (member Test : string -> string) (model, ""))
    ignore
Run Code Online (Sandbox Code Playgroud)

你可能最好使用一个界面:

type IModel
  abstract Test : string -> string
Run Code Online (Sandbox Code Playgroud)