Scalaの代数的データ型
1. 序章
このチュートリアルでは、代数的データ型(ADT)とは何か、およびそれらを使用してScalaでデータモデルを定義する方法について説明します。
2. 代数的データ型とは何ですか?
ADTはScalaで一般的に使用されています。 簡単に言えば、 an 代数的データ型は、ProductまたはSumパターンを使用する任意のデータです。
ここで問題は、製品と合計タイプが何であるかを理解することに移ります。
3. 製品タイプパターン
他のデータを含むデータをモデル化する必要がある場合は、製品タイプパターンを使用できます。
チェスの駒の簡略化されたモデルを定義しましょう。
case class ChessPiece(color: Color, name: Name)
val rook = ChessPiece(White, Rook)
この場合、
オブジェクト指向の用語では、これは「has-a」関係です。
ChessPieceデータには他のデータが含まれています。 製品タイプは多くの場合、ケースクラスとして定義されます。
4. 合計タイプパターン
異なる値をとることができるタイプを定義する必要がある場合は、 sumtypeパターンを活用できます。
チェスの駒の例に戻ると、ColorとNameを次のように定義できます。
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でから入手できます。