3
F#, Nominative or Structural?では、いくつかのエキゾチックなメカニズムを介して構造的に型付けされた言語のように動作するようにF#をトリックできると答えました。どうすればいいですか?公称型言語で構造型をサポートするにはどうすればよいですか?
F#, Nominative or Structural?では、いくつかのエキゾチックなメカニズムを介して構造的に型付けされた言語のように動作するようにF#をトリックできると答えました。どうすればいいですか?公称型言語で構造型をサポートするにはどうすればよいですか?
以前の回答が指している「エキゾチックなメカニズム」はおそらく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
:たとえば、あなたはタイプstring
のName
部材を有する任意のオブジェクトで動作しますsayHello
関数を書くことができますF#は主に名目上の型付けされた言語なので、静的メンバーの制約をあまりにも多用することは、一元的なものになります。コードの見栄えが悪くなり、メカニズムの限界にぶつかる可能性があります。 のための素晴らしい機能です。限定された使用例ですが、F#の主要な抽象化メカニズムではありません。
彼は "メカニズム* s *"と言っていますので、静的に解決された型パラメータ以外に別のトリックがありますか? – MiP
F#が構造的に動作する他のケースがあると思いますが(例えば計算式ビルダー)、私が考える限り、静的メンバーの制約とそのさまざまな用途はF#の唯一の明らかな構造的なものです。 –
メンバーをどのように追加するかをきれいにする。ショートカットを試しましたが、 'let inline sayHello(any:^ T:(メンバー名:文字列))= printfn"こんにちは%s "any.Name'はそれをカットしていないようです。 – Funk