Как мне написать это ограничение члена в F #? - PullRequest
16 голосов
/ 14 января 2011

Для типа

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

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

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

Что я делаю не так?

1 Ответ

25 голосов
/ 14 января 2011

Проблема не в явном написании ограничений, а в том, что синтаксис не так хорош, что вы можете наложить ограничение на член для параметра и затем вызвать его обычным способом. Тело 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...