2011-01-14 8 views
15

Per un tipoCome si scrive questo vincolo membro in F #?

type Cow() = 
    class 
     member this.Walk() = Console.WriteLine("The cow walks.") 
    end 

posso scrivere un metodo che impone un membro vincolare per il metodo Walk Like

let inline walk_the_creature creature = 
    (^a : (member Walk : unit -> unit) creature) 
// and then do 
walk_the_creature (Cow()) 

In questo caso il tipo viene dedotto. Sono in grado di scrivere in modo esplicito un vincolo sul parametro creatura come questa

// Does not compile 
// Lookup on object of indeterminate type based on information prior to this 
// program point. A type annotation may be needed... 
let inline walk_the_creature_2 (creature:^a when ^a:(member Walk : unit -> unit)) = 
    creature.Walk() 

Che cosa sto facendo di sbagliato?

risposta

23

Non sta scrivendo esplicitamente i vincoli che è il problema, è che la sintassi non è così bella che è possibile posizionare un vincolo membro su un parametro e quindi richiamare il membro nel solito modo. Il corpo di walk_the_creature e walk_the_creature2 sarebbe lo stesso qui:

let inline walk_the_creature_2 (creature:^a when ^a:(member Walk : unit -> unit)) = 
    (^a : (member Walk : unit -> unit) creature) 
+0

Potrebbe spiegare perché è necessario il corpo deve essere scritto in questo modo. Non sono tutte le informazioni sul tipo già presenti nel secondo metodo? –

+10

Il sistema di vincoli dei membri è piuttosto complesso e separato dal sistema di tipo nominale, quindi non si ottiene la sintassi di invocazione nominale dei membri gratuitamente. Infatti, '(^ a: (membro Walk: unit -> unit) creatura)' non invoca nulla, è un modello per generare un'implementazione specifica del tipo (in linea) della funzione in fase di compilazione. Suppongo che la sintassi unificata desiderata possa essere implementata, ma il team di F # non ha mai previsto che i vincoli dei membri diventino così popolari, intendendoli solo per le librerie principali, e quindi la sintassi è un totale naufragio in questa versione (incrocio delle dita). –

Problemi correlati