如何支持名义类型语言的结构类型?

时间:2017-04-14 17:04:37

标签: c# .net f# functional-programming ocaml

F#, Nominative or Structural?中,答案说我可以通过一些奇特的机制欺骗F#像结构类型的语言一样工作。我怎么能这样做?

1 个答案:

答案 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#中的主要抽象机制。