Подтвердить что ты не робот

Как написать это ограничение элемента в F #?

Для типа

type Cow() =
    class
        member this.Walk () = Console.WriteLine("The cow walks.")
    end

Я могу написать метод, который принудительно ограничивает член для метода Walk like

let inline walk_the_creature creature =  
    (^a : (member Walk : unit -> unit) creature)
// and then do
walk_the_creature (Cow())

В этом случае тип выводится. Я не могу явно написать ограничение на параметр существа, подобный этому

// 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()

Что я делаю неправильно?

4b9b3361

Ответ 1

Он явно не пишет ограничения, которые являются проблемой, так что синтаксис не так хорош, что вы можете поместить ограничение члена в параметр, а затем вызвать элемент обычным способом. Тело walk_the_creature и walk_the_creature2 будет здесь одинаковым:

let inline walk_the_creature_2 (creature:^a when ^a:(member Walk : unit -> unit)) =
    (^a : (member Walk : unit -> unit) creature)