簡體   English   中英

使用F#在類/接口中動態定義幾個成員

[英]Define several members dynamically in class/interface using 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 * int -> int

如您所見,除名稱外,成員簽名是相同的。

我能否在下一個中使用F#(現在將是偽代碼 ):

let names = [ "Add", "Subtract", "Multiply", "Divide" ];
let ICalculations = new interface;

foreach ( name in names ) {
    ICalculations[ name ] : int * int -> int
}

目的不是要為每個成員重復簽名int * int -> int

可能嗎?

接口聲明后不能定義接口方法類型。 但是您可以定義例如Dictionary,其中包含您類型的函數:

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...

或者,為了簡潔起見,您可以為函數類型定義類型別名:

type Op = int * int -> int
type IСalculations =
    abstract member Add : Op    
    abstract member Subtract : Op
    abstract member Multiply : Op
    abstract member Divide : Op

聲明接口的唯一語法是:

// 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM