Option

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)