¿Cómo funciona este tipo de anotación y por qué el otro no?

Por favor explique la magia detrásdrawShape función. 1) ¿Por qué funciona? Me refiero a cómo llama alDraw miembro, 2) por qué tiene que 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

Y el siguiente problema es: ¿es posible escribirdrawShape funciona usando la anotación de tipo de parámetro como a continuación? Descubrí que tiene exactamente la misma firma que la primera, pero no puedo completar el cuerpo.

let inline drawShape2 (shape : ^a when ^a : (member Draw : unit->unit)) =
    ...

Gracias por adelantado.

Respuestas a la pregunta(1)

Su respuesta a la pregunta