web-dev-qa-db-ja.com

Scalaの何が素晴らしいのですか?

Scalaこのようなすばらしい言語、-その他が型システムよりも優れている理由は何ですか?言語について読んだほとんどすべてのものが、「強い型付け」をScalaを使用する大きな理由として引き出しますScalaを本当に便利なツールにする他の説得力のある、および/またはクールな言語機能のいくつかは何ですか?

31
Don Werve

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] 同じように。

同様にいくつかの静的型の良さを投げると、私はその言語で非常に速く売られました。

33
andri

それはたくさんの言語からの最高のビットのマッシュアップであり、好きではないものです:

  • Rubyの簡潔な構文
  • Javaのパフォーマンス
  • Erlangのアクターサポート
  • クロージャー/ブロック
  • マップと配列の便利な省略形
24
Michael

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で完全に使用できます。

22
Kevin Wright

Scalaは初めてですが、私の印象は次のとおりです。

本当に良いJVM統合が原動力になります。 JRubyはJavaおよびJavaはJRubyコードを呼び出すことができますが、明示的に別の言語を呼び出しており、Scala-Javaの完全な統合ではありません。 Javaライブラリ、さらには同じプロジェクトで混合して一致させます。

scalaを検討し始めました。次の優れた言語を動かすものは簡単な並行性であることに気づきました。JVMはパフォーマンスの観点から優れた並行性を持っています。誰かが言うと確信していますそのErlangの方が優れていますが、Scalaは実際には通常のプログラマが使用できます。

Javaが落ちるのは、それが非常に痛いほど冗長であることです。Functorを作成して渡すには、あまりにも多くの文字が必要です。Scalaは、関数を引数として渡すことができます。

Javaでは、共用体型を作成したり、既存のクラスにインターフェースを適用したりすることはできません。どちらもScalaでは簡単です。

静的型付けは通常、冗長性の大きなペナルティを持っています。 Scalaは、コンパイル時の型チェックである静的型付けの利点を提供しながら、この欠点を排除し、エディターでのコード支援を容易にします。

言語を拡張する機能。これは何十年もの間LISPを動かし続けてきたものであり、それによってRuby on Railsが許可されました。

15
Kevin Peterson

型システムはScalaの最も特徴的な機能です。また、Javaなどと比べて、多くの構文上の利便性があります。

しかし、私にとって、Scalaの最も説得力のある機能は次のとおりです。

実際には、これらの機能を使用すると、Haskellの type classes を概算できます(いくつかの点でそれを超えることができます)。組み合わせると、非常にモジュール式のコードを記述できます。

10
Apocalisp

すぐに:

  • Javaライブラリのパワーとプラットフォームに依存しないが、ボイラープレートと冗長性はありません。
  • Rubyのシンプルさと生産性を得ることができますが、静的型付けとコンパイルされたバイトコードがあります。
  • Haskellの優れた機能と並行性のサポートを利用できますが、パラダイムシフトを完全に行わず、オブジェクト指向の利点を活用できます。

とりわけ、そのすばらしい機能のすべてで特に魅力的だと思うもの:

  • Javaでの定型コードのロードを必要とするオブジェクト指向の設計パターンのほとんどは、ネイティブでサポートされています。マッチング)、戦略(クロージャー経由)など.
  • ドメインモデルとDSLを非常に簡潔に定義でき、コード生成やフレームワークを必要とせずに、必要な機能(通知、関連付けの処理、解析、シリアル化)でそれらを拡張できます。
  • そして最後に、十分にサポートされているJavaプラットフォームとの完全な相互運用性があります。JavaとScala方向。Scalaの煩わしさからコードを維持するのが困難になるため、Javaに切り替えても、ペナルティや互換性の問題はほとんどありません。
6
thSoft

Scalaの優れた機能についてはすでに説明しました。ただし、過去のすべての機能で際立っているのは、すべてが上品に統合されていることです。

Scalaは、急いで機能を追加した気分にならずに、周囲で最も強力な言語の1つになっています。言語は、ポイントを証明するための学術的な演習でもありません。革新性と本当に先進的なコンセプトが、驚くほど実用的でエレガントな言語に取り入れられています。

つまり、Martin Oderskyは純粋なデザインの天才です。それがScalaのすばらしいところです!

4
John Nilsson

制御フローの表現力。たとえば、なんらかの方法で処理する必要のあるデータのコレクションを持つことは非常に一般的です。これは、処理がいくつかのプロパティ(投資商品の通貨)によるグループ化と、(おそらく通貨ごとの合計を取得するための)合計の実行を含む取引のリストである場合があります。

Javaでは、これには、グループ化を行うコード(forループの数行)と、合計を行う別のコード(forループ)を分離する必要があります。Scala 、このタイプのことは、通常、関数プログラミングを使用して1行のコードで達成でき、折りたたみを行います。

もちろん、これはJavaでの関数型言語に対する単なる議論です。

4
oxbow_lakes

おそらく、複数のプロセッサでScalaコードを実行 同時に )するのは非常に簡単です。

4
Chase Seibert

マルチパラダイム(OOおよびFP)の性質を追加したいScala他の言語よりも優れている

3
GClaramunt

コーディングする毎日Javaあなたはますます惨めになり、コーディングする毎日Scalaあなたは幸せになります。

3
Bryan Hunt

機能に関する議論を放棄し、スタイルについて話す場合、それはパイプラインスタイルのコーディングと言えます。いくつかのオブジェクトまたはコレクションから始めて、ドットとプロパティまたはドットと変換を入力し、目的の結果が得られるまでそれを実行します。このようにして、読みやすい変換のチェーンを簡単に記述できます。ある程度までの特性は、型を構築するために同じアプローチを適用することも可能にします。

1
Alexey

ここでは、関数型言語の魅力についてかなり詳しく説明します。

関数型言語(具体的にはErlang)はどのように/なぜ適切にスケーリングしますか?

1
Spencer Ruport