Como essa anotação de tipo funciona e por que a outra não?
Por favor, explique a mágica por trásdrawShape
função. 1) Por que funciona de verdade - quero dizer como ele chama oDraw
2) por que precisa serinline
?
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 a próxima questão é - é possível escreverdrawShape
função usando anotação de tipo de parâmetro como abaixo? Descobri que ele tem exatamente a mesma assinatura que a primeira, mas não consigo concluir o corpo.
let inline drawShape2 (shape : ^a when ^a : (member Draw : unit->unit)) =
...
Desde já, obrigado.