2017-04-14 71 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