31

型システム以外に Scala がこれほど素晴らしい言語である理由は何ですか? 私がこの言語について読んだほとんどすべての記事で、Scala を使用する大きな理由として「強い型付け」が挙げられていますが、それ以上の理由があるはずです。Scala を本当に便利なツールにしている、魅力的でクールな言語機能には他にどのようなものがありますか?

4

14 に答える 14

33

私が Scala を好むようになった理由のいくつかを以下に示します (たとえば、通常の Java よりも):

a) 型推論。それを行うJavaの方法:

Map<Something, List<SomethingElse>> list = new HashMap<Something, List<SomethingElse>>()

.. Scala に比べてかなり冗長です。これらのリストのいずれかを指定すると、コンパイラはそれを理解できるはずです。

b) 一次関数。繰り返しますが、この機能はクラスでエミュレートできますが、見栄えがよくありません。

c) と を持つmapコレクションfold。これらの 2 つは (b) と結びついており、Java を書かなければならないときはいつでもこの 2 つが欲しいと思っています。

d) パターンマッチングとケースクラス。

e )分散S extends TList[S] extends List[T]

いくつかの静的型の利点も取り入れて、私はこの言語をすぐに気に入りました。

于 2009-04-07T18:49:15.180 に答える
22

Scala は、クロージャとインプリシットを持つことでしばしばパレードされます。クロージャーの欠如と明示的な型付けは、おそらく Java ボイラープレートの 2 つの最大の原因であるため、驚くことではありません。

しかし、もう少し詳しく調べると、迷惑な部分のない Java をはるかに超えています。おそらく、Scala の最大の強みは、特定の名前付き機能ではなく、他の回答で言及されているすべての機能を統合することにどれほど成功しているかです。 .

ポストファンクショナル

たとえば、オブジェクト指向と関数型プログラミングの結合: 関数はオブジェクトであるため、Scala は Maps に Function インターフェイスを実装させることができました。価値。これらのパラダイムをうまく統合する点で、Scala は真に事後機能言語です。

または、実際には演算子を持たないことによって達成される演算子のオーバーロードは、中置表記で使用される単なるメソッドです。そのため、整数1 + 2でメソッドを呼び出すだけです。代わりに+メソッドに名前が付けられている場合は、 と変わらないものとして使用します。これは、別の機能の組み合わせによって可能になります。Scala のすべてはオブジェクトであり、プリミティブがないため、整数はメソッドを持つことができます。plus1 plus 21.plus(2)

その他の機能の融合

型クラスについても言及されており、高カインド型、シングルトン オブジェクト、および Implicit の組み合わせによって実現されます。

うまく連携するその他の機能は、ケース クラスとパターン マッチングです。Java が要求する面倒な等価性、ハッシュコード、コンストラクター、getter/setter ロジックをすべて手動で記述することなく、代数データ型を簡単に構築および分解できます。

デフォルトで不変性を指定し、遅延値を提供し、ファースト クラス関数を提供することで、効率的な機能データ構造を構築するのに非常に適した言語が実現します。

リストはまだまだ続きますが、私は Scala を 3 年以上使用していますが、今でもほぼ毎日、すべてがうまく連携していることに驚かされています。

効率的で多用途

Scala は小さな言語でもあり、仕様は (驚くべきことに!) Java の約 1/3 のサイズしか必要としません。これは、Java の仕様に多くの特殊なケースがあり、Scala が簡略化するためであり、プリミティブや演算子などの機能が削除されているためであり、多くの機能が言語からライブラリに移動されているためです。

この利点として、Scala ライブラリの作成者が利用できるすべての手法は、すべての Scala ユーザーも利用できるため、独自の制御フロー構造を定義したり、DSL を構築したりするための優れた言語になります。これは、サードパーティの Actor フレームワークである Akka などのプロジェクトで大きな効果を発揮するために使用されています。

深い

最後に、プログラミング スタイルの全範囲を拡張します。

ランタイム インタープリター (REPL として知られています) を使用すると、対話型セッションでアイデアをすばやく調べることができます。また、明示的なコンパイルを必要とせずに、Scala ファイルをスクリプトとして実行することもできます。これを型推論と組み合わせると、Ruby、Perl、bash スクリプトなどの動的言語の感覚が Scala にもたらされます。

スペクトルの反対側では、トレイト、クラス、オブジェクト、および自己型を使用すると、サードパーティ ツールを必要とせずに、個別のコンポーネントに基づいて依存性注入を使用して本格的なエンタープライズ システムを構築できます。Scala はまた、ネイティブ Java とほぼ同等のレベルで Java ライブラリと統合し、JVM で実行することにより、そのプラットフォームで提供されるすべての速度の利点を活用できるだけでなく、Tomcat などのコンテナーで完全に使用したり、 OSGi。

于 2010-09-14T22:31:38.557 に答える
15

私はScalaを初めて使用しますが、私の印象は次のとおりです。

本当に優れたJVM統合が推進要因になります。JRubyはjavaを呼び出すことができ、javaはJRubyコードを呼び出すことができますが、Scala-Javaの完全な統合ではなく、別の言語を明示的に呼び出しています。したがって、Javaライブラリを使用でき、同じプロジェクトで組み合わせることもできます。

次の素晴らしい言語を動かすのは簡単な並行性であることに気付いたとき、私はscalaを見始めました。JVMは、パフォーマンスの観点から優れた並行性を備えています。誰かがErlangの方が優れていると言うでしょうが、Scalaは実際には通常のプログラマーが使用できます。

Javaが失敗するのは、それが非常に痛々しいほど冗長であるということです。ファンクターを作成して渡すには、文字が多すぎます。Scalaでは、関数を引数として渡すことができます。

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

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

言語を拡張する機能。これは、Lispを何十年も続けてきたものであり、RubyonRailsを可能にしました。

于 2009-04-07T23:15:33.730 に答える
10

型システムは、Scala の最も特徴的な機能です。また、たとえばJavaよりも多くの構文上の便利さがあります。

しかし、私にとって Scala の最も魅力的な機能は次のとおりです。

実際、これらの機能により、Haskell の型クラスに近似する (そしてある意味ではそれを超える) ことができます。組み合わせることで、非常にモジュラーなコードを書くことができます。

于 2009-05-13T06:00:16.143 に答える
6

すぐに:

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

私が特に魅力的だと思うのは、その素晴らしい機能のすべてです。

  • シングルトン (オブジェクト経由)、アダプター、デコレーター (トレイトとインプリシット経由)、ビジター (パターン マッチング経由)、ストラテジー (クロージャー経由) など、Java でボイラープレート コードのロードを必要とするオブジェクト指向のデザイン パターンのほとんどは、ネイティブにサポートされています。 .
  • ドメイン モデルと DSL を非常に簡潔に定義でき、コード生成やフレームワークを必要とせずに、必要な機能 (通知、関連付けの処理、解析、シリアル化) を使用してそれらを拡張できます。
  • 最後に、十分にサポートされている Java プラットフォームとの完全な相互運用性があります。Java と Scala を双方向で混在させることができます。コードの保守が困難になる Java の煩わしさを経験した後に Scala に切り替える場合、大きなペナルティや互換性の問題はありません。
于 2009-04-16T21:08:14.943 に答える
5

関数型プログラミングが JVM にもたらされました

于 2009-04-07T18:46:33.097 に答える
4

Scalaの優れた機能についてはすでに説明しました。しかし、過去のすべての機能を通して輝いていることの1つは、すべてがいかに上品に統合されているかです。

Scalaは、急いで機能を追加したような感覚を持たずに、なんとか最も強力な言語の1つになりました。また、言語は、ポイントを証明するための学術的な演習でもありません。革新と本当に高度な概念は、驚くべき実用性と優雅さで言語にもたらされます。

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

于 2011-07-15T20:32:56.770 に答える
4

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

于 2009-04-07T18:45:15.143 に答える
4

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

Java では、グループ化を行うコード (数行の for ループ) と、合計を行う別のコード (別の for ループ) を分離する必要があります。Scala では、この種のことは通常、関数型プログラミングを使用して 1 行のコードで実現可能であり、その後、非常に表現力豊かに l から r を読み取るフォールディングを行います。

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

于 2009-04-16T11:37:01.007 に答える
3

マルチパラダイム (OO および FP) の性質を追加して、Scala が他の言語よりも優位に立つようにしたい

于 2009-04-30T21:49:06.043 に答える
3

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

于 2011-05-20T20:19:24.597 に答える
1

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

于 2010-01-16T14:59:04.777 に答える
1

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

関数型言語 (特に Erlang) はどのように/なぜうまくスケーリングするのですか?

于 2009-04-07T18:58:07.310 に答える