タグ

scalaとmonadに関するrrrkanekoのブックマーク (2)

  • 猫番 — State データ型

    State データ型 不変 (immutable) なデータ構造を使ってコードを書いていると、 何らかの状態を表す値を引き回すというパターンがよく発生する。 僕が好きな例はテトリスだ。テトリスの関数型の実装があるとして、 Tetrix.init が初期状態を作って、他に色々な状態遷移関数が変換された状態と何らかの戻り値を返すとする: val (s0, _) = Tetrix.init() val (s1, _) = Tetrix.nextBlock(s0) val (s2, moved0) = Tetrix.moveBlock(s1, LEFT) val (s3, moved1) = if (moved0) Tetrix.moveBlock(s2, LEFT) else (s2, moved0) 状態オブジェクト (s0, s1, s2, …) の引き回しはエラーの温床的なボイラープレート

  • Scalaで書くFreer Monads, More Extensible Effects - Qiita

    sealed trait Freer[F[_], A] { def map[B](f: A => B): Freer[F, B] = flatMap(a => Pure(f(a))) def flatMap[B](f: A => Freer[F, B]): Freer[F, B] = this match { case Pure(a) => f(a) case Impure(fa, g) => Impure(fa, (a: Any) => g(a).flatMap(f)) } } case class Pure[F[_], A](a: A) extends Freer[F, A] case class Impure[F[_], A, B](fa: F[A], f: A => Freer[F, B]) extends Freer[F, B]

    Scalaで書くFreer Monads, More Extensible Effects - Qiita
  • 1