Si prega di spiegare la magia dietro la funzione drawShape
. 1) Perché funziona a tutti - intendo come chiama il membro Draw
, 2) perché deve essere inline
?Come funziona questa annotazione di tipo e perché l'altra no?
type Triangle() =
member x.Draw() = printfn "Drawing triangle"
type Rectangle() =
member x.Draw() = printfn "Drawing rectangle"
let inline drawShape (shape : ^a) =
(^a : (member Draw : unit->unit) shape)
let triangle = Triangle()
let rect = Rectangle()
drawShape triangle
drawShape rect
E il prossimo numero è - è possibile scrivere drawShape
funzione utilizzando tipo di parametro di annotazione come qui di seguito? Ho scoperto che ha esattamente la stessa firma del primo, ma non sono in grado di completare il corpo.
let inline drawShape2 (shape : ^a when ^a : (member Draw : unit->unit)) =
...
Grazie in anticipo.
la magia è tutta nel compilatore F # - non si sa più cosa dire - per il secondo problema: senza vedere il corpo/errore è abbastanza difficile dire a – Carsten
Ho provato a inserire 'shape.Draw()' nel corpo senza successo. L'errore è: 'errore FS0072: ricerca su oggetto di tipo indeterminato basato su informazioni precedenti a questo punto programma. Potrebbe essere necessaria un'annotazione di tipo prima di questo punto del programma per vincolare il tipo dell'oggetto. Questo può consentire di risolvere la ricerca. – Endrju
ah vedo - be ', purtroppo, devi ripetere la stessa cosa che hai fatto in 'drawShap' ancora una volta (la parte all'interno di' (^ a: (membro Draw: ...) forma) ' – Carsten