Cats の型クラス
Functor、Monad などです。
「Cats の型クラス」はCoddyKit上の無料Scala for Backend Engineering & Functional Programmingレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはScala for Backend Engineering & Functional Programming学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
型クラスとは
型クラスは、アドホック多相性のためのパターンです。型自体を変更せずに、その型へ振る舞いを追加できます。Catsは、関数型プログラミング向けに豊富な型クラス階層を提供するScalaライブラリです。
Functor—mapを適用できるものApplicative— 独立したエフェクトを組み合わせるものMonad— 依存関係のあるエフェクトを順番に実行するもの
Functor:map
Functor[F]はmapを提供します。コンテキストの構造を変えずに、その内部の値を変換します。
import cats.Functor
import cats.instances.option._
val f = Functor[Option].map(Some(2))(_ + 1)
println(f) // Some(3)Functorの法則
正しいFunctorは、次の2つの法則に従う必要があります。
- 恒等性:
fa.map(x => x) == fa - 合成:
fa.map(f).map(g) == fa.map(f.andThen(g))
これらの保証により、mapのチェーンを安全にリファクタリングできます。
Applicative: pureとap
Applicative[F]はFunctorを拡張し、pure(値をコンテキストに持ち上げる)と、mapNによって独立した値を結合する機能を追加します。
import cats.Applicative
import cats.instances.option._
val lifted = Applicative[Option].pure(42)
println(lifted) // Some(42)mapNによる結合
mapN構文は、複数の独立したエフェクト付きの値を1つに結合し、すべての値がそろった時点で関数を適用します。
import cats.syntax.apply._
import cats.instances.option._
val result = (Option(1), Option(2), Option(3)).mapN(_ + _ + _)
println(result) // Some(6)Monad: flatMap
Monad[F]はApplicativeを拡張し、依存する計算を順番に実行するflatMapを追加します。各ステップは、直前のステップの結果に依存できます。
import cats.Monad
import cats.instances.option._
val m = Monad[Option].flatMap(Some(3))(x => Some(x * 10))
println(m) // Some(30)Monadの法則
Monadは次の3つの法則に従う必要があります。
- 左恒等性:
pure(a).flatMap(f) == f(a) - 右恒等性:
m.flatMap(pure) == m - 結合性: ネストしたflatMapはグループ化を変更できます
SemigroupとMonoid
Semigroup[A]はcombine(結合則を満たす)を定義します。Monoid[A]はさらに単位元emptyを追加します。これらは畳み込みや累積処理の基盤になります。
import cats.syntax.semigroup._
import cats.instances.int._
import cats.instances.string._
println(3 |+| 4) // 7
println("foo" |+| "bar") // foobarFoldable
Foldable[F]は、構造に対する畳み込みを抽象化します。Monoidと組み合わせると、combineAllによってコレクションを1つの値にまとめられます。
import cats.Foldable
import cats.instances.list._
import cats.instances.int._
val total = Foldable[List].combineAll(List(1, 2, 3, 4))
println(total) // 10Traverse
Traverse[F]を使うと、各要素をエフェクトにマッピングして結果を集め、List[F[A]]をF[List[A]]に変換できます。
import cats.syntax.traverse._
import cats.instances.list._
import cats.instances.option._
val r = List(1, 2, 3).traverse(x => Option(x * 2))
println(r) // Some(List(2, 4, 6))型クラスが重要な理由
型クラスを使うと、必要な振る舞いを提供する任意の型で動作するコードを書けます。Monad[F]の制約を持つ関数は、Option、List、IOなどで動作します。一度書けば、どこでも再利用できます。
import cats.Monad
import cats.syntax.flatMap._
import cats.syntax.functor._
def twice[F[_]: Monad, A](fa: F[A])(f: A => A): F[A] =
fa.flatMap(a => Monad[F].pure(f(f(a))))クイックチェック
依存する計算を順番に実行するためのflatMapを追加する型クラスはどれですか?
まとめ
ここでは、コアとなるCatsの型クラス階層を学びました。
Functor—mapApplicative—pureとmapNMonad—flatMapSemigroup/Monoid—combine/emptyFoldable/Traverse— 畳み込みとエフェクトの収集
次は、エフェクトを純粋にモデル化するIOモナドを学びます。
よくある質問
「Cats の型クラス」レッスンは無料ですか?
はい。「Cats の型クラス」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Scala for Backend Engineering & Functional Programmingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
「Cats の型クラス」で何を学びますか?
Functor、Monad などです。 ブラウザで直接実行するハンズオンコードでScala for Backend Engineering & Functional Programmingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Scala for Backend Engineering & Functional Programmingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのScala for Backend Engineering & Functional Programmingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「Cats の型クラス」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このScala for Backend Engineering & Functional Programmingレッスンでコードを書いて実行できますか?
はい。すべてのScala for Backend Engineering & Functional Programmingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。