MiP*_*MiP 4 .net c# f# ocaml functional-programming
在F#,Nominative还是Structural?答案说,我可以通过一些奇特的机制欺骗F#像结构类型的语言一样工作.我怎么能这样做?
前面的答案所指的"奇异机制"可能是静态解析的类型参数.这使您可以编写具有某些特定成员的任何类型的对象的函数.例如,您可以编写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#中的主要抽象机制.