在F#, Nominative or Structural?中,答案说我可以通过一些奇特的机制欺骗F#像结构类型的语言一样工作。我怎么能这样做?
答案 0 :(得分:8)
"异国情调的机制"之前的答案可能是statically resolved type parameters。这使您可以编写具有某些特定成员的任何类型的对象的函数。例如,您可以编写sayHello
函数,该函数将与Name
string
成员类型的let inline sayHello (any : ^T) =
let name = (^T : (member Name : string) any)
printfn "Hello %s" name
成员一起使用:
type Person(name:string) =
member x.Name = name
type Animal(name:string) =
member x.Name = name
sayHello (Person("Tomas"))
sayHello (Animal("Bunny"))
现在,这将使用两种名义上无关的类型:
MultiViews
也就是说,F#主要是一种名义上类型的语言,因此过于依赖静态成员约束会是单一的。这将使您的代码看起来很糟糕,并且您可能会遇到该机制的限制。对于一些有限的用例来说,这是一个很好的功能,但它不是F#中的主要抽象机制。