Dynamic 使用F在类/接口中动态定义几个成员#

Dynamic 使用F在类/接口中动态定义几个成员#,dynamic,types,interface,f#,Dynamic,Types,Interface,F#,我正在用F#做一个小程序,只是为了个人训练,有一些时间我无法解决 我正在描述一些接口: type IСalculations = abstract member Add : int * int -> int abstract member Subtract : int * int -> int abstract member Multiply : int * int -> int abstract member Divide : int * in

我正在用F#做一个小程序,只是为了个人训练,有一些时间我无法解决

我正在描述一些接口:

type IСalculations =
    abstract member Add : int * int -> int
    abstract member Subtract : int * int -> int
    abstract member Multiply : int * int -> int
    abstract member Divide : int * int -> int
如您所见,除了名称之外,成员签名是相同的

我是否能够使用F#下一个(现在将是伪代码):

目的不是为每个成员重复签名
int*int->int


是否可能?

在接口声明之后不能定义接口方法类型。 但您可以定义字典,例如,包含您类型的函数:

open System.Collections.Generic    
type Ops = Add | Subtract | Multiply | Divide
let pseudoInterface = Dictionary<Ops, int * int -> int>()

// Then somewhere in your program you could define this "methods"
pseudoInterface.[Add] <- fun (i, j) -> i + j
pseudoInterface.[Subtract] <- fun (i, j) -> i - j // etc...

声明接口的唯一语法是:

// Interface declaration:
[ attributes ]
type interface-name =
   [ interface ]     [ inherit base-interface-name ...]
     abstract member1 : [ argument-types1 -> ] return-type1
     abstract member2 : [ argument-types2 -> ] return-type2
     ...
   [ end ]
在伪代码的第二行:

let ICalculations = new interface;
您希望使用let绑定或等效绑定。 不幸的是,绑定只能将标识符与值或函数关联,而不能与类型或接口关联。 所以我恐怕没有办法。 除F#之外的其他函数式语言(如Idris)也可以做到这一点。 如果您只为重复int*int->int的冗长而烦恼,您可以定义如下类型别名:

module T =
  type Op = int * int -> int

type IСalculations =
    abstract member Add : T.Op
    abstract member Subtract : T.Op
    abstract member Multiply : T.Op
    abstract member Divide : T.Op

考虑是否可以在没有接口的情况下对问题进行建模:
let ICalculations = new interface;
module T =
  type Op = int * int -> int

type IСalculations =
    abstract member Add : T.Op
    abstract member Subtract : T.Op
    abstract member Multiply : T.Op
    abstract member Divide : T.Op