質問

ScalaのタイプシステムはJavaの相互運用性によって弱体化しているため、Haskellのタイプシステムと同じ力の一部を実行できないことを読みました。これは本当ですか?タイプの消去のために弱さはありますか、それとも私はあらゆる点で間違っていますか?この違いは、Scalaにタイプクラスがない理由ですか?

役に立ちましたか?

解決

大きな違いは、ScalaにはHindley-Milnerグローバルタイプの推論がなく、代わりにローカルタイプの推論の形式を使用しているため、メソッドパラメーターのタイプを指定し、過負荷または再帰関数のリターンタイプを指定する必要があることです。

これは、タイプの消去またはJVMの他の要件によって駆動されるものではありません。ここで考えられるすべての困難は克服することができ、Jaskellを考慮してください - http://docs.codehaus.org/display/jaskell/home

HM推論は、オブジェクト指向のコンテキストでは機能しません。具体的には、型ポリモーフィズムが使用される場合(タイプクラスのアドホック多型とは対照的に)。これは、他のJavaライブラリとの強力な相互作用にとって非常に重要であり、JVMから可能な限り最高の最適化を取得するために(それほどではないが)重要です。

HaskellまたはScalaのいずれかがより強力なタイプシステムを持っていることを述べることは本当に無効ではありません。どちらの言語も、タイプベースのプログラミングの境界をさまざまな方向に押し上げており、各言語には、他の言語で複製するのが難しい独自の強みがあります。

他のヒント

ScalaのタイプシステムはHaskellのシステムとは異なりますが、Scalaの概念は、Haskellの強みと研究者や専門家の知識豊富なコミュニティに直接触発されることがあります。

もちろん、最初に機能的なプログラミングを主に意図していないVMで実行すると、このプラットフォームをターゲットにした既存の言語との互換性の懸念が生じます。タイプに関する推論のほとんどはコンパイル時に発生するため、実行時にJava(言語として、およびプラットフォームとして)の制限は心配することはありません(タイプの消去を除く、まさにこのバグはJavaへの統合になっているようですエコシステムはよりシームレス)。

私が知る限り、Javaを使用したタイプシステムレベルの唯一の「妥協」は、生のタイプを処理する特別な構文です。 Scalaは生の種類さえ許可していませんが、そのバグで古いJavaクラスファイルを受け入れます。たぶんあなたはのようなコードを見たことがあります List[_] (またはより長い同等のもの List[T] forSome { type T })。これはJavaとの互換性機能ですが、内部的にも実存的なタイプとして扱われ、タイプシステムを弱めません。

Scalaのタイプシステムはサポートしています タイプクラス, 、しかし、Haskellよりも冗長な方法で。この論文を読むことをお勧めします。これは、Scalaのタイプシステムの相対的な強さに異なる印象を与える可能性があります(17ページの表は、非常に強力なタイプシステムの概念の素晴らしいリストとして機能します)。

タイプシステムのパワーに必ずしも関連しているわけではありませんが、ScalaとHaskellのコンパイラがタイプを推測するために使用するアプローチは、人々がコードを書く方法にある程度の影響を与えます。強力なタイプの推論アルゴリズムを持つことで、より抽象的なコードを書くのに価値があります(それがすべての場合に良いことであるかどうかを自分で決定できます)。

最終的に、ScalaとHaskellのタイプシステムは、ユーザーに問題を解決するための最良のツールを提供したいという願望によって推進されていますが、その目標には異なるパスをとっています。

考慮すべきもう1つの興味深いポイントは、Scalaが古典的なOOスタイルを直接サポートすることです。つまり、あります サブタイプ 関係(たとえば、リストはSEQのサブクラスです)。そして、これにより、タイプの推論がよりトリッキーになります。これに加えて、Scalaの特性を混ぜることができるという事実を追加します。つまり、特定のタイプは複数のスーパータイプの関係を持つことができます(さらにトリッキーになります)

Scalaにはありません rank-nタイプ, 、それは可能かもしれませんが この制限を回避します 特定の場合。

私はHaskellをほとんど経験していませんが、Haskellとは異なるScala型システムがタイプの推論であることに注意してください。

Scalaでは、グローバルタイプの推論はありません。関数引数のタイプを明示する必要があります。

たとえば、Scalaでは、これを書く必要があります。

def add (x: Int, y: Int) = x + y

それ以外の

add x y = x + y

これは、あらゆる種類のタイプで動作する一般的なバージョンの追加関数が必要な場合に問題を引き起こす可能性があります。これには回避策がありますが、より冗長になります。

しかし、実際に使用すると、Scalaのタイプシステムは毎日の使用に十分強力であることがわかりました。一般的な回避策を使用することはほとんどありません。これは、Java Worldから来たからかもしれません。

そして、明示的な宣言の制限は、引数の種類が悪いことではないことを宣言します。とにかく文書化する必要があります。

さて、彼らは還元可能ですか?

Oleg Kiselyovのページをご覧ください http://okmij.org/ftp/... HaskellのタイプシステムにLambda計算を実装できます。 Scalaがそれを行うことができる場合、ある意味でHaskellのタイプシステムとScalaのタイプシステムが同じタイプを計算します。質問は次のとおりです。一方はどれほど自然ですか?互いにどれほどエレガントですか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top