The Choose effect is used for non-deterministic computations. With the Choose effect you can model computations which either:

Choose is actually a generalization of List where instead of “exploring” all the branches we might “cut” some of them. That behaviour is controlled by the Alternative[F] instance you use when running Choose.

For example if we take List to run a similar example as before, we get the list of all the accepted pairs:

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

      type S = Fx.fx1[Choose]

// create all the possible pairs for a given list
// where the sum is greater than a value
      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)

> List((2,4), (3,3), (3,4), (4,2), (4,3), (4,4))