3
在F#, Nominative or Structural?,答案说我可以欺骗F#通过一些奇特的机制像结构类型语言一样工作。我该怎么做?如何支持名义类型语言的结构类型?
在F#, Nominative or Structural?,答案说我可以欺骗F#通过一些奇特的机制像结构类型语言一样工作。我该怎么做?如何支持名义类型语言的结构类型?
以前的答案提到的“异国机制”可能是statically resolved type parameters。这使您可以编写具有某个特定成员的任何类型的对象的函数。例如,你可以写sayHello
功能,将与具有string
型Name
成员的任何对象工作:
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"))
那说,F#主要是一种名义上的类型化语言,所以依靠静态成员约束太多将是unidiomatic。它会让你的代码看起来很糟糕,你可能会遇到机制的限制。这对于一些有限的用例是一个很好的功能,但它不是F#中的主要抽象机制。
他说“机制* s *”所以除了静态解析类型参数旁边还有其他技巧吗? – MiP
我猜还有其他一些F#在结构上行为的情况(例如计算表达式构建器),但据我所知,静态成员约束及其各种用法是F#中唯一明显的结构化的东西。 –
整洁如何将成员添加到任何。试过快捷方式,但是 'let inline sayHello(any:^ T when^T:(member Name:string))= printfn“Hello%s”any.Name“似乎并没有削减它。 – Funk