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