How do I write this member constraint in F#?

浪子不回头ぞ 提交于 2019-12-17 10:51:53

问题


For a type

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

I can write a method which enforces a member constrain for method Walk like

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

In this case the type is inferred. I am unable to explicitly write a constraint on the creature parameter like this

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

What am I doing wrong?


回答1:


It's not explicitly writing the constraints that is the issue, it's that the syntax is not so nice that you can place a member constraint on a parameter and then invoke the member in the usual way. The body of walk_the_creature and walk_the_creature2 would be the same here:

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


来源:https://stackoverflow.com/questions/4694633/how-do-i-write-this-member-constraint-in-f

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!