2017-04-14 8 views

答えて

8

以前の回答が指している「エキゾチックなメカニズム」はおそらくstatically resolved type parametersです。これにより、特定のメンバを持つ任意の型のオブジェクトを取る関数を書くことができます。

type Person(name:string) = 
    member x.Name = name 

type Animal(name:string) = 
    member x.Name = name 

sayHello (Person("Tomas")) 
sayHello (Animal("Bunny")) 

:これは今、名目上は関係ない二つのタイプで動作します

let inline sayHello (any : ^T) = 
    let name = (^T : (member Name : string) any) 
    printfn "Hello %s" name 

:たとえば、あなたはタイプstringName部材を有する任意のオブジェクトで動作しますsayHello関数を書くことができますF#は主に名目上の型付けされた言語なので、静的メンバーの制約をあまりにも多用することは、一元的なものになります。コードの見栄えが悪くなり、メカニズムの限界にぶつかる可能性があります。 のための素晴らしい機能です。限定された使用例ですが、F#の主要な抽象化メカニズムではありません。

+2

彼は "メカニズム* s *"と言っていますので、静的に解決された型パラメータ以外に別のトリックがありますか? – MiP

+1

F#が構造的に動作する他のケースがあると思いますが(例えば計算式ビルダー)、私が考える限り、静的メンバーの制約とそのさまざまな用途はF#の唯一の明らかな構造的なものです。 –

+0

メンバーをどのように追加するかをきれいにする。ショートカットを試しましたが、 'let inline sayHello(any:^ T:(メンバー名:文字列))= printfn"こんにちは%s "any.Name'はそれをカットしていないようです。 – Funk

関連する問題