1

Une idée de tacit programming consiste à ne pas appliquer d'arguments aux fonctions si cela peut être évité. Pourquoi F # n'autorise-t-il pas cette compilation si les fonctions sont des membres de première classe?Implémenter l'interface F # via la programmation tacite

Pourquoi?

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 

Je reçois l'erreur de compilation ...

Aucune propriété abstraite a été trouvé qui correspond à cette dérogation

Je pense que cela devrait compiler. adder.Add implémente clairement IAdder.Add et devrait être acceptable.

Répondre

2

Vous ne pouvez pas affecter des membres d'interface comme s'ils étaient des fonctions. Les interfaces ne fonctionnent pas comme ça. Vous devez spécifier les paramètres:

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

Mais les interfaces sont généralement bleh. Ils sont seulement bons pour passer des fonctions génériques sans perdre la généricité. Lorsque les fonctions sont non génériques, les interfaces sont strictement inférieures.

Si vous étiez prêt à aller avec une approche plus fonctionnelle à la place, la vie serait facile obtenir rapide:

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

J'aime qu'il ya une façon plus fonctionnelle d'aborder ce sujet. La contrainte est que je dois interopérer avec du code écrit en C#. Merci pour votre réponse. – t3dodson

+2

@ t3dodson Si vous avez besoin d'interopérer avec C#, alors les arguments au curry devraient probablement être évités dans vos interfaces. Travailler avec 'FSharpFunc's en code C# ne va pas créer une expérience idiomatique. – TheInnerLight

+1

@TheInnerLight, Ils ont seulement l'air curry du côté F #. Les fonctions membres et les fonctions let-bound sont compilées avec des méthodes normales sans tenir compte de l'exécution. –