2013-02-26 5 views
23

CLRジェネリックスの実装では、JVMの機能よりも多くの機能がサポートされており、JVMのジェネリックは単なるJavaの"compiler trick"であるため、F#では高級な型は使用できませんが、Scalaでは可能です。 JVMの欠如は、設計者が意図した以上に進むことを可能にする一方で、CLRジェネリック実装は何とかして物事の中に入りますか?動的言語のように、強く型付けされたコンパイラでは不可能なトリックを実行できますか?高級タイプ - Scalaでは可能ですが、F#ではできないのはなぜですか?

+10

なぜこれが閉じられましたか?私は本当に説明を理解していない。私は事実を提供しており、実際の答えがある質問をしています。誰かが元々問題が述べられているように「良い」という言葉に抱きついているように見え、議論の的となった答えを作り出しましたが、それはその質問に関するものではありませんでした。人々は単に「より良い」のようなキーワードを探し、先験的に閉じることに投票しますか? – lobsterism

答えて

20

原則として、F#がより高い種類の類型を含むのを防ぐ何かがあるとは確信していません。 CLRはそれらをネイティブにサポートしていないので、より間接的なコンパイル戦略を使用する必要がありますが、JVM上のScalaの場合もそうです。 CLRの標準化されたジェネリックスの上でこれを行うのはもっと複雑かもしれませんが、F#にそれが含まれていない理由はより哲学的だと思われます。より親切な型がいいかもしれませんが、F#のデザインは他の.NET言語とうまく連携するシンプルな機能を好む傾向があります。より親切な型は多分言語への追加に多大な努力を必要とし、型推論や言語の他の部分を複雑にし、C#や他の.NET言語との相互作用を間違っていると思われるので、コスト(機会費用を含む)はおそらく利益を上回ります。

+0

Scalaで定義された上位の類型は、Javaと相互に作用しませんか? – lobsterism

+1

@lobsterism - 私はScalaのエキスパートではありませんが、Javaのタイプのシステムはそれらをサポートしていないので、どうすればよいかはわかりません。 – kvb

-4

おそらく。

私が知っている唯一の違いは、「専門化」と呼ばれるジェネリックの機能です。そして、Scalaのプログラマ制御下で利用可能です。だから...私はScalaが「より良い」というケースを作ることができると言わなければならないだろう。

+0

Scala *は*優れていますが、それは私が言っていることですが、CLRがJVMに比べてより強力な型システムを持っていると、F#でそれが不可能である理由が疑問です。 – lobsterism

+0

@lobsterism JavaとJVMは同じものではありません...つまり、scalaはjavaと比較して "強力な"型指定システムを持つことができますが、どちらも同じJVMを使用します! – korefn

+1

実際、Scalaの「特殊化」は、JVMの短期間のリリースを公開しています。プリミティブ型はオブジェクト階層外であり、ジェネリック型は解決されていません。 .NETとF#には、オブジェクト階層の一部である「ValueTypes」がありますが、JVMのプリミティブ型のすべてのパフォーマンス上の利点があります。つまり、.NETの 'List '( 'Int32'は.NETの' ValueType'です)のような型は完全に改訂され、要素にアクセスするためにボクシング/アンボックリングは必要ありません。 –

関連する問題