Choose

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))