2017-04-14 86 views

回答

8

以前的答案提到的“异国机制”可能是statically resolved type parameters。这使您可以编写具有某个特定成员的任何类型的对象的函数。例如,你可以写sayHello功能,将与具有stringName成员的任何对象工作:

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

+2

他说“机制* s *”所以除了静态解析类型参数旁边还有其他技巧吗? – MiP

+1

我猜还有其他一些F#在结构上行为的情况(例如计算表达式构建器),但据我所知,静态成员约束及其各种用法是F#中唯一明显的结构化的东西。 –

+0

整洁如何将成员添加到任何。试过快捷方式,但是 'let inline sayHello(any:^ T when^T:(member Name:string))= printfn“Hello%s”any.Name“似乎并没有削减它。 – Funk