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

MiP*_*MiP 4 .net c# f# ocaml functional-programming

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

Tom*_*cek 9

前面的答案所指的"奇异机制"可能是静态解析的类型参数.这使您可以编写具有某些特定成员的任何类型的对象的函数.例如,您可以编写sayHello适用于具有Name类型成员的任何对象的函数string:

let inline sayHello (any : ^T) = 
  let name = (^T : (member Name : string) any)
  printfn "Hello %s" name
Run Code Online (Sandbox Code Playgroud)

现在,这将使用名义上不相关的两种类型:

type Person(name:string) = 
  member x.Name = name

type Animal(name:string) = 
  member x.Name = name

sayHello (Person("Tomas"))
sayHello (Animal("Bunny"))
Run Code Online (Sandbox Code Playgroud)

也就是说,F#主要是名义上键入的语言,因此过于依赖静态成员约束将是单一的.这将使您的代码看起来很糟糕,并且您可能会遇到机制的限制.对于一些有限的用例来说,这是一个很好的功能,但它不是F#中的主要抽象机制.

  • 他说"机制*s*"除静态解析类型参数外还有其他技巧吗? (2认同)