Option
をエフェクトに追加することで、必要なときに計算を止めることができる。some(a)
で値を作ったらこの値は下流で使われるが、none
を使ったら残りの計算が停止する。
import org.atnos.eff._, all._, syntax.all._
/**
* スタックの宣言
*/
type S = Fx.fx1[Option]
// このスタックを計算
val map: Map[String, Int] =
Map("key1" -> 10, "key2" -> 20)
// マップから2つのキーを取りだし、それらに対応する値を結合する
def addKeys(key1: String, key2: String): Eff[S, Int] = for {
a <- fromOption(map.get(key1))
b <- fromOption(map.get(key2))
} yield a + b
(addKeys("key1", "key2").runOption.run, addKeys("key1", "missing").runOption.run)
> (Some(30),None)