Reader

Reader エフェクトは「環境」に値を要求するために使う。主なメソッドは ask であり、現在の環境(または、そう見なすのがお好みなら「設定」)を取得する。それから runReader メソッドに環境を表す値を提供することで Reader エフェクトを含んだエフェクトスタックを実行することができる。

「局所的」な Reader を「より大きな」Readerに注入することもできる。

import org.atnos.eff._, all._, syntax.all._
import cats.data._

case class Conf(host: String, port: Int)

type R1[A] = Reader[Int, A]
type R2[A] = Reader[Conf, A]

type S = Fx.fx2[R1, R2]

def getPort[R](implicit r: Reader[Int, *] |= R): Eff[R, String] = for {
  p1 <- ask[R, Int]
} yield "the port is " + p1

getPort[S].translateReader((_: Conf).port).runReader(Conf("prod", 80)).run

> the port is 80