Qualcuno può spiegare questa curiosità F #?Argomenti ripetuti nelle interfacce
type IFoo =
abstract member Bar1: int * int -> int * int
abstract member Bar2: int * int -> (int * int)
abstract member Bar3: (int * int) -> int * int
type Foo() = class end
with
interface IFoo with
member this.Bar1 (x, y) = (x, y)
member this.Bar2 (x, y) = (x, y) // Same impl as Bar1 i.e. parentheses on RHS of -> in interface member definition are ignored
// member this.Bar3 (x, y) = (x, y) // Compile error: "This override takes a different number of arguments to the corresponding abstract member"
member this.Bar3 tuple = tuple // So, parentheses on LHS of -> in interface member definition *does* make a difference!
Qual è la differenza di significato tra le definizioni di IFoo.Bar1
e IFoo.Bar3
?
Interessante: i dettagli della CLI stanno perdendo nella sintassi F #. Immagino che sia necessario per motivi di interoperabilità? Per il puro codice F #, non vedo alcun motivo per distinguere i due casi. – Akash
@Akash Non importa perché, il mondo dei metodi CLI è diventato una parte di F # come linguaggio multi-paradigma. Ha sovraccarico, ereditarietà e override, argomenti opzionali e così via, e queste funzionalità non sono considerate esclusive per l'interoperabilità nel modo in cui è null. Ma non sempre si combinano bene con la programmazione funzionale-prima. Nel puro codice funzionale, queste funzioni non sono utilizzate, quindi la parte funzionale si adatta bene ai metodi CLI, fatta eccezione per il raro disagio mostrato nella domanda. – Vandroiy