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?
Potrebbe spiegare perché è necessario il corpo deve essere scritto in questo modo. Non sono tutte le informazioni sul tipo già presenti nel secondo metodo? –
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). –