Choose
エフェクトは非決定性計算のために使われる。Choose
エフェクトにより、次のどちらかになる計算をモデル化できる。
Choose
は、実質的には
List
を一般化したものだ。すべての分岐を「探索」する代わりに、いくつかを「無視」する。このふるまいは、Choose
エフェクトを実行するときに使う
Alternative[F]
インスタンスにより管理されている。
たとえば以前と同じような例を実行するために
List
を受け取るとしたら、許されるペアすべてのリストが得られる。
import org.atnos.eff._, all._, syntax.all._
type S = Fx.fx1[Choose]
// 与えられたリストから許されるペア(その合計が値 n より大きい)すべてを作る。
def pairsBiggerThan[R :_choose](list: List[Int], n: Int): Eff[R, (Int, Int)] = for {
a <- chooseFrom(list)
b <- chooseFrom(list)
found <- if (a + b > n) EffMonad[R].pure((a, b))
else zero
} yield found
import cats.instances.list._
pairsBiggerThan[S](List(1, 2, 3, 4), 5).runChoose.run
> List((2,4), (3,3), (3,4), (4,2), (4,3), (4,4))