1. 序章

このチュートリアルでは、代数的データ型(ADT)とは何か、およびそれらを使用してScalaでデータモデルを定義する方法について説明します。

2. 代数的データ型とは何ですか?

ADTはScalaで一般的に使用されています。 簡単に言えば、 an 代数的データ型は、ProductまたはSumパターンを使用する任意のデータです。

ここで問題は、製品合計タイプが何であるかを理解することに移ります。

3. 製品タイプパターン

他のデータを含むデータをモデル化する必要がある場合は、製品タイプパターンを使用できます。

チェスの駒の簡略化されたモデルを定義しましょう。

case class ChessPiece(color: Color, name: Name)
val rook = ChessPiece(White, Rook)

この場合、 「ChessPieceには色と名前があります」。 この記事の後半で、色と名前の定義をドリルダウンします。

オブジェクト指向の用語では、これは「has-a」関係です。

ChessPieceデータには他のデータが含まれています。 製品タイプは多くの場合、ケースクラスとして定義されます。

4. 合計タイプパターン

異なる値をとることができるタイプを定義する必要がある場合は、 sumtypeパターンを活用できます。

チェスの駒の例に戻ると、ColorNameを次のように定義できます。

sealed trait Color
final case object White extends Color
final case object Black extends Color

sealed trait Name
final case object Pawn extends Name
final case object Rook extends Name
final case object Knight extends Name
final case object Bishop extends Name
final case object Queen extends Name
final case object King extends Name

オブジェクト指向の用語を使用すると、合計タイプの関係を「isa」として表すことができます。

上記の例では「 色は白または黒です」。 封印された特性は、合計タイプを定義する方法です。

5. さらにいくつかのパターン

前の章の例で見たように、および/または演算子と組み合わされた関係は次のとおりです。

  • ChessPieceにはカラーの名前があります
  • カラーホワイトまたはブラック

まだ2つの組み合わせがあります欠落しています: has-a+orおよびis-a+and。

前者のhas-a+またはは、次のように表すことができます。

trait Semaphore {
    val color: Color
}

sealed trait Color
final case object Green extends Color
final case object Amber extends Color
final case object Red extends Color

私たちのコード「セマフォには-色があり、色は緑または琥珀色または赤です」

最後に確認するパターンはis-a+ andで、次のようにコードに変換できます:

trait Feline
trait Animal
trait Cat extends Animal with Feline

この例では、「猫は動物であり猫です」。

6. パターンマッチング

ADTを使用する場合、パターンマッチングの使用は当然のことであり、この関数型プログラミングイディオムの使用を奨励します。

次の例では、積と合計のタイプを活用して、ピースがボードの中で最も重要であるかどうかを示すメソッドを作成する方法を見てみましょう。 ChessPieceの属性name、 a sum type product type をチェックして、処理しているピースを判別できます。

def isTheMostImportantPiece(c: ChessPiece): Boolean = c match {
    case ChessPiece(_, King) => true
    case _ => false
}

これは、この場合にパターンマッチングが非常に便利であり、ADTと非常にうまく調和する方法の例です。

7. 結論

この記事では、Scalaコードでオブジェクトの関係を変換する方法を見ました。 これらのパターンを認識し、認識することは、慣用的な関数型コードを作成するために重要です。

いつものように、コードはGitHubから入手できます。