1

Eine Idee von tacit programming ist, Argumente nicht auf Funktionen anzuwenden, wenn dies vermieden werden kann.Implementierung der F # -Schnittstelle über Tacit-Programmierung

Warum erlaubt F # dies nicht zu kompilieren, wenn Funktionen Mitglieder erster Klasse sind?

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 

ich die Kompilierungsfehler erhalten ...

Keine Zusammenfassung Eigenschaft wurde festgestellt, dass

ich, dass diese kompilieren sollten das Gefühl zu dieser Überschreibung entspricht. adder.Add implementiert eindeutig IAdder.Add und sollte akzeptabel sein.

Antwort

2

Sie können Schnittstellenelemente nicht so zuweisen, als wären sie Funktionen. Schnittstellen funktionieren nicht so. Sie müssen die Parameter angeben:

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

Aber Schnittstellen sind in der Regel bläh. Sie eignen sich nur dazu, allgemeine Funktionen zu übergeben, ohne die Generizität zu verlieren. Wenn Funktionen nicht-generisch sind, sind Schnittstellen streng unterlegen.

Wenn Sie bereit sind, statt mit einem funktionalen Ansatz zu gehen, wäre das Leben einfach schnell erhalten:

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

Ich mag, dass es eine funktionelle Art und Weise, dies zu nähern. Die Bedingung ist, dass ich mit in C# geschriebenem Code interoperieren muss. Danke für deine Antwort. – t3dodson

+2

@ t3dodson Wenn Sie mit C# interop müssen, dann sollten curried Args wahrscheinlich auch in Ihren Schnittstellen vermieden werden. Die Arbeit mit 'FSharpFunc's in C# -Code wird nicht für eine idiomatische Erfahrung sorgen. – TheInnerLight

+1

@TheInnerLight, Sie sehen nur von F # Seite curried. Member-Funktionen und Let-gebundene Funktionen werden unabhängig vom Curry zu normalen Methoden kompiliert. –

Verwandte Themen