1

tacit programming的一個想法是不能將參數應用於函數,如果可以避免的話。通過默認編程實現F#接口

如果函數是第一類成員,爲什麼F#不允許這樣編譯?

type IAdder = 
    interface 
    abstract member Add : int -> int -> int 
end 

type Adder = 
    interface IAdder with 
     member this.Add x y = x + y 

type AdderWithInnerAdder(adder:IAdder) = 
    interface IAdder with 
     member this.Add = adder.Add 

我得到的編譯錯誤...

沒有抽象屬性發現,對應於這個覆蓋

我覺得這應該編譯。 adder.Add明確實施了IAdder.Add並且應該是可以接受的。

回答

2

您不能像接口函數那樣分配接口成員。接口不能像那樣工作。你必須指定參數:

member this.Add x y = adder.Add x y 

但接口通常是可以使用的。它們只適用於傳遞泛型函數而不會失去通用性。當函數是非泛型的時候,接口是嚴格低劣的。

如果你願意與一個功能更強大的方式去代替,生活會得到易迅:

type Adder = { Add: int -> int -> int } 
let adder() = { Add = fun x y -> x + y } 
let adderWithInnerAdder adder = { Add = adder.Add } 
+1

我喜歡,有接近這一個功能更強大的方式。約束是我必須與用C#編寫的代碼進行互操作。感謝您的回答。 – t3dodson

+2

@ t3dodson如果您需要與C#進行互操作,那麼在您的界面中也應該避免使用curried參數。在C#代碼中使用'FSharpFunc's不會帶來慣用的體驗。 – TheInnerLight

+1

@TheInnerLight,他們只從F#一邊看咖啡。成員函數和let-bound函數被編譯爲普通方法,而不考慮currying。 –