Scalaこのようなすばらしい言語、-その他が型システムよりも優れている理由は何ですか?言語について読んだほとんどすべてのものが、「強い型付け」をScalaを使用する大きな理由として引き出しますScalaを本当に便利なツールにする他の説得力のある、および/またはクールな言語機能のいくつかは何ですか?
Scala(たとえば、通常のJavaよりも))を支持してくれたもののいくつかを以下に示します。
a)型推論。 Javaそれを行う方法:
Map<Something, List<SomethingElse>> list = new HashMap<Something, List<SomethingElse>>()
..はScalaに比べてかなり冗長です。これらのリストの1つを指定すると、コンパイラーはそれを理解できるはずです。
b)1次関数。繰り返しますが、この機能はクラスでエミュレートできますが、醜いです。
c)map
およびfold
を含むコレクション。これら2つは(b)と連動しており、Javaを記述する必要があるたびに、これら2つは私が望むものです。
d)パターンマッチングとケースクラス。
e)分散、つまりS extends T
、次にList[S] extends List[T]
同じように。
同様にいくつかの静的型の良さを投げると、私はその言語で非常に速く売られました。
それはたくさんの言語からの最高のビットのマッシュアップであり、好きではないものです:
Scalaはしばしば、クロージャーとインプリシットを持つためにパレードされます。 Javaボイラープレートの最大の原因はおそらくクロージャーと明示的な型指定がないことです。
しかし、少し深く調べてみると、迷惑なJavaを使わないビットをはるかに超えています。おそらくScalaの最大の強みは、特定の名前付き機能ではありませんが、他の回答で言及されているすべての機能を統合します。
たとえば、オブジェクト指向と関数型プログラミングの結合:関数はオブジェクトなので、ScalaはMapsにFunctionインターフェースを実装させることができたため、マップを使用して値を検索すると、関数を使用して値を計算するのとは構文的に異なります。これらのパラダイムを非常によく統合する場合、Scalaは本当にポスト関数型言語です。
または、演算子のオーバーロードは、実際には演算子を持たないことによって実現されます。これらは、中置記法で使用される単なるメソッドです。したがって、_1 + 2
_は整数の_+
_メソッドを呼び出すだけです。メソッドの名前がplus
である場合は、代わりに_1 plus 2
_として使用します。これは1.plus(2)
と同じです。これは、機能の別の組み合わせにより可能になりました。 Scalaのすべてがオブジェクトであり、プリミティブがないため、整数はメソッドを持つことができます。
種類のクラスも言及され、より種類の高い型、シングルトンオブジェクト、および暗黙の組み合わせによって実現されました。
一緒にうまく機能する他の機能は、ケースクラスとパターンマッチングです。これにより、Java要求。
デフォルトで不変性を指定し、遅延値を提供し、ファーストクラス関数を提供することにより、効率的な関数型データ構造の構築に非常に適した言語が提供されます。
リストは続きますが、Scalaを3年以上使用していますが、すべてがうまく機能していることに毎日驚かされています。
Scalaも小さな言語であり、(驚くべきことに!)仕様はJavaのサイズの約3分の1で十分です。これは、一部にはJavaが仕様で多くの特殊なケースを持っているためですScalaは、プリミティブや演算子などの機能を削除したため、多くの機能が言語からライブラリに移されたためです。
これの利点として、Scalaライブラリ作成者が利用できるすべての手法は、すべてのScalaユーザーにも利用可能であり、独自の制御フローコンストラクトとDSLの構築これは、サードパーティのアクターフレームワークであるAkkaのようなプロジェクトで大きな効果を発揮します。
最後に、プログラミングスタイルの全範囲をスケーリングします。
ランタイムインタープリター(REPLと呼ばれる)を使用すると、インタラクティブセッションでアイデアを非常にすばやく探索でき、Scalaファイルは、明示的なコンパイルを必要とせずにスクリプトとして実行することもできます。型推論と組み合わせると、これにより、Scala Ruby、Perl、bashスクリプトなどの動的言語の感触が得られます。
特性の反対側では、特性、クラス、オブジェクト、および自己型により、サードパーティのツールを必要とせずに、別個のコンポーネントに基づいて依存関係の注入を使用する本格的なエンタープライズシステムを構築できます。 ScalaはJavaライブラリとも統合され、ネイティブJavaとほぼ同等のレベルであり、JVMで実行することにより、提供されるすべての速度の利点を活用できます。そのプラットフォームでは、TomcatなどのコンテナやOSGiで完全に使用できます。
Scalaは初めてですが、私の印象は次のとおりです。
本当に良いJVM統合が原動力になります。 JRubyはJavaおよびJavaはJRubyコードを呼び出すことができますが、明示的に別の言語を呼び出しており、Scala-Javaの完全な統合ではありません。 Javaライブラリ、さらには同じプロジェクトで混合して一致させます。
scalaを検討し始めました。次の優れた言語を動かすものは簡単な並行性であることに気づきました。JVMはパフォーマンスの観点から優れた並行性を持っています。誰かが言うと確信していますそのErlangの方が優れていますが、Scalaは実際には通常のプログラマが使用できます。
Javaが落ちるのは、それが非常に痛いほど冗長であることです。Functorを作成して渡すには、あまりにも多くの文字が必要です。Scalaは、関数を引数として渡すことができます。
Javaでは、共用体型を作成したり、既存のクラスにインターフェースを適用したりすることはできません。どちらもScalaでは簡単です。
静的型付けは通常、冗長性の大きなペナルティを持っています。 Scalaは、コンパイル時の型チェックである静的型付けの利点を提供しながら、この欠点を排除し、エディターでのコード支援を容易にします。
言語を拡張する機能。これは何十年もの間LISPを動かし続けてきたものであり、それによってRuby on Railsが許可されました。
型システムはScalaの最も特徴的な機能です。また、Javaなどと比べて、多くの構文上の利便性があります。
しかし、私にとって、Scalaの最も説得力のある機能は次のとおりです。
実際には、これらの機能を使用すると、Haskellの type classes を概算できます(いくつかの点でそれを超えることができます)。組み合わせると、非常にモジュール式のコードを記述できます。
すぐに:
とりわけ、そのすばらしい機能のすべてで特に魅力的だと思うもの:
Scalaの優れた機能についてはすでに説明しました。ただし、過去のすべての機能で際立っているのは、すべてが上品に統合されていることです。
Scalaは、急いで機能を追加した気分にならずに、周囲で最も強力な言語の1つになっています。言語は、ポイントを証明するための学術的な演習でもありません。革新性と本当に先進的なコンセプトが、驚くほど実用的でエレガントな言語に取り入れられています。
つまり、Martin Oderskyは純粋なデザインの天才です。それがScalaのすばらしいところです!
制御フローの表現力。たとえば、なんらかの方法で処理する必要のあるデータのコレクションを持つことは非常に一般的です。これは、処理がいくつかのプロパティ(投資商品の通貨)によるグループ化と、(おそらく通貨ごとの合計を取得するための)合計の実行を含む取引のリストである場合があります。
Javaでは、これには、グループ化を行うコード(forループの数行)と、合計を行う別のコード(forループ)を分離する必要があります。Scala 、このタイプのことは、通常、関数プログラミングを使用して1行のコードで達成でき、折りたたみを行います。
もちろん、これはJavaでの関数型言語に対する単なる議論です。
おそらく、複数のプロセッサでScalaコードを実行 同時に )するのは非常に簡単です。
マルチパラダイム(OOおよびFP)の性質を追加したいScala他の言語よりも優れている
コーディングする毎日Javaあなたはますます惨めになり、コーディングする毎日Scalaあなたは幸せになります。
機能に関する議論を放棄し、スタイルについて話す場合、それはパイプラインスタイルのコーディングと言えます。いくつかのオブジェクトまたはコレクションから始めて、ドットとプロパティまたはドットと変換を入力し、目的の結果が得られるまでそれを実行します。このようにして、読みやすい変換のチェーンを簡単に記述できます。ある程度までの特性は、型を構築するために同じアプローチを適用することも可能にします。
ここでは、関数型言語の魅力についてかなり詳しく説明します。