9

私は人々がそれを主張するのを聞いた:

  • Scalaの型システムは素晴らしいです(存在型、バリアント、共バリアント)

  • マクロの力のために、すべてがClojureのライブラリです:(パターンマッチング、論理プログラミング、非決定論、..)

質問:

両方のアサーションが真である場合、Scalaの型システムがClojureのライブラリではないのはなぜですか?それは:

  • タイプは、ライブラリとしてうまく機能しないものの1つですか?[つまり、変更は、clojure.coreを含むすべての既存のclojureライブラリを介してスレッド化する必要がありますか?]

  • Scalaのタイプの概念は、clojureプロトコル/レコードと基本的に互換性がありませんか?

  • ...?

4

2 に答える 2

12

興味深い質問です。

Scala が驚くべき型システムを持っていること、Clojure が言語のメタプログラミングと拡張にとって驚異的であることについては確かに正しいです (ただし、それは単なるマクロ以上のものです....)。

私が考えることができるいくつかの理由:

  1. Clojure は動的型付け言語ですが、Scala は静的型付け言語です。強力な型推論は、入力の型についてほとんど想定できない言語ではあまり役に立ちません。
  2. Clojure には、タイピングをライブラリとして追加する非常に興味深いプロジェクト ( Typed Clojure ) が既にあり、これは非常に有望に見えますが、最初から動的言語用に設計されているため、Scala へのアプローチは大きく異なります ( Typed Racketにもっと影響を受けていると思います)。 )。
  3. Clojure の哲学は、特定の OOP の概念 (特に、実装の継承、変更可能なオブジェクト、およびデータのカプセル化) を思いとどまらせます。これらのことをサポートする型システム (Scala のように) は、Clojure のイディオムには適していません。せいぜいそれらは無視されますが、後で深刻な問題に遭遇する原因となる開発スタイルを簡単に助長する可能性があります。
  4. Clojure は、他の言語の型で通常解決する問題の多くを解決するツールを既に提供しています。たとえば、ポリモーフィズムのためのプロトコルの使用などです。
  5. Clojure コミュニティでは、シンプルさに重点が置かれています (優れたビデオ「Simple Made Easy」という意味で- 特に 39:30 のスライドを参照してください)。Scala の型システムは確かに素晴らしいですが、「シンプル」と表現するのは無理があると思います。
  6. Scala スタイルの型システムを組み込むには、Clojure コンパイラーを完全に書き直す必要があり、かなり複雑になります。これまでのところ、その特定の課題に取り組むためにサインアップした人は誰もいないようです...そして、誰かがこれを行う意思と能力を持っていたとしても、上記のさまざまな文化的/技術的理由により、変更が拒否される可能性があるというリスクがあります.

Clojure 自体に大きな変更がない場合 (可能性は低いと思います)、特定のドメインに Scala スタイルの型推論を提供し、この DSL を最適化された Java バイトコードに直接コンパイルする DSL を Clojure 内で作成するという興味深い可能性があります。 . 特定の問題領域 (たとえば、大規模な行列を使用した大規模な数値データの処理) に対する有用なアプローチであることがわかりました。

于 2012-08-14T06:29:55.130 に答える
5

「なぜScalaの型システムはClojureのライブラリではないのですか?」という質問に簡単に答えるには:

型システムは scala ライブラリではなく、scala コンパイラの一部であるためです。scala 型システムの全能力は、コンパイル時にのみ存在します。JVM はそのようなことをサポートしていません。これは、型の消去と、単純に実行速度が低下するためです。また、それは必要ありません。静的に型付けされた言語を使用している場合、汚いことをしたくない限り、実行時に型情報は必要ありません。

編集:

@mikera jvm は確実に scala コンパイラを実行できますが、そのようなことは何も言いませんでした。jvm はそのような型システムをサポートしていないと言いました。ジェネリックもサポートしていません。実行時には、これらの型はすべてなくなります。コンパイラは、プログラムの正確性をチェックし、上位の種類の型/ジェネリックをすべて削除します。

例:

val xs: List[Int] = List(1,2,3,4)
val x1: Int = xs.head

実行時に次のようになります。

val xs: List = List.apply(1,2,3,4)
val x1: Int = xs.head.asInstanceOf[Int]

ただし、コンパイラが以前にチェックしたため、問題ではありません。リストに任意の値を入れることができ、実行時に値がキャストされた場所で正確に壊れるため、リフレクションを使用する場合にのみ問題が発生する可能性がありますInt

これが理由の 1 つであり、scala 型システムが scala ライブラリの一部ではなく、コンパイラに組み込まれている理由の 1 つです。

また、OP の質問は「... Scala の型システムが Clojure のライブラリではないのはなぜですか?」というものでした。「clojureのscalasなどの型システムを作成することは可能ですか?」ではありません。私はその質問に完璧に答えました。

于 2012-08-14T09:07:44.020 に答える