Как работает аннотация этого типа, а почему нет?

Пожалуйста, объясните магиюdrawShape функция. 1) Почему это работает вообще - я имею в виду, как это называетсяDraw член, 2) почему это должно бытьinline?

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

И следующий вопрос - можно ли написатьdrawShape Функция с использованием аннотации типа параметра, как показано ниже? Я обнаружил, что у него точно такая же подпись, как у первой, но я не могу завершить тело.

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

Заранее спасибо.

Ответы на вопрос(1)

Ваш ответ на вопрос