Scala 3(Dotty)の新機能

Scala 3(コードネーム:Dotty)は、Scala 2からの大幅な進化を遂げたバージョンであり、言語の表現力、型システム、構文、メタプログラミング機能など、多岐にわたる改良が加えられています。以下に、Scala 3で導入された主な新機能を詳しくご紹介します。InfoQ+1Scalapedia+1


1. コンテキスト抽象化(Contextual Abstractions)

Scala 2で使用されていたimplicitの概念が整理され、より明確な意図を持つ構文が導入されました。Qiita+1Scala Documentation+1

  • givenusing: givenは型クラスのインスタンス定義に、usingは暗黙の引数の受け渡しに使用されます。これにより、関数のシグネチャが簡潔になり、意図が明確になります。Scala Documentation+1cats cats cats+1

  • 拡張メソッド(Extension Methods): 既存の型に対して、新たなメソッドを追加できるようになりました。Scala 2ではimplicit classを用いて実現していましたが、Scala 3では言語仕様として正式にサポートされています。eed3si9n.com+2Scala Documentation+2Scalapedia+2

  • コンテキスト関数(Context Functions): 暗黙の引数を取る関数型を第一級オブジェクトとして扱うことができ、DSL(ドメイン特化言語)の設計やライブラリ開発において強力なツールとなります。Scala Documentation


2. 型システムの強化

Scala 3では、型システムが大幅に拡張され、より表現力豊かで安全なプログラミングが可能となりました。Qiita+2Scala Documentation+2InfoQ+2

  • 交差型(Intersection Types): A & Bのように、複数の型の性質を同時に持つ型を表現できます。これは、Scala 2のwithに代わるものです。InfoQ+2Scalapedia+2Scalapedia+2

  • 合併型(Union Types): A | Bのように、いずれかの型であることを表現できます。これにより、柔軟な型の制約が可能になります。

  • 不透明型(Opaque Types): opaque typeを使用することで、実装の詳細を隠蔽しつつ、パフォーマンスの低下を避けることができます。これは、Scala 2の値クラスに代わる概念です。Scala Documentation+1eed3si9n.com+1

  • 従属関数型(Dependent Function Types): 関数の戻り値の型が、引数の値に依存するような関数型を表現できます。

  • カインド多相(Kind Polymorphism): 型パラメータのカインド(型の型)に制約を設けず、より抽象的な型定義が可能になりました。Qiita+1eed3si9n.com+1


3. 構文の改善と簡素化

Scala 3では、構文がより簡潔で読みやすくなるよう改善されています。InfoQ

  • 中括弧の省略とインデントベースの構文: Pythonのように、インデントによってブロックを表現できるようになりました。これにより、コードの可読性が向上します。

  • newキーワードの省略: クラスのインスタンス化時にnewを省略できるようになり、コードが簡潔になります。InfoQ

  • thenキーワードの導入: if文などの制御構造において、thenを使用することで、構文が明確になります。


4. 列挙型(Enums)の導入

Scala 3では、列挙型が正式にサポートされ、より簡潔で直感的な定義が可能になりました。InfoQ

scala
enum Direction: case North, South, East, West

これは、Scala 2でのsealed traitcase objectの組み合わせに比べて、記述が簡潔で明瞭です。InfoQ+1InfoQ+1


5. メタプログラミングとマクロの強化

Scala 3では、マクロ機能が再設計され、より安全で強力なメタプログラミングが可能となりました。InfoQ+1Scalapedia+1

  • inlineキーワード: 関数や値をインライン化することで、パフォーマンスの向上や、コンパイル時の最適化が可能になります。eed3si9n.com

  • クォートとスプライス(Quote & Splice): コンパイル時にコードを生成・操作するための新しい構文が導入され、より強力なマクロの作成が可能になりました。eed3si9n.com


6. クラスの継承制御

Scala 3では、クラスの継承に関する制御が明確になりました。InfoQ

  • openキーワード: デフォルトでクラスはfinalと見なされ、継承を許可する場合は明示的にopenキーワードを使用する必要があります。これにより、意図しない継承を防ぐことができます。Zenn


これらの新機能により、Scala 3はより表現力豊かで、安全かつ効率的なプログラミング言語へと進化しています。詳細な情報や具体的な使用例については、公式ドキュメントをご参照ください。

Scala Documentation

生成日:2025/05/04