Dynamic 使用F在类/接口中动态定义几个成员#
我正在用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
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