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, …) の引き回しはエラーの温床的なボイラープレート