List

List エフェクトは複数の値を返す計算に使うことができる。このエフェクトを使う単純な例はこうだ。

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

type S = Fx.fx1[List]

// 与えられたリストから、指定の値よりも合計が大きくなる
// ありえる組み合わせすべてを作る
def pairsBiggerThan[R :_list](list: List[Int], n: Int): Eff[R, (Int, Int)] = for {
  a <- values(list:_*)
  b <- values(list:_*)
  found <- if (a + b > n) singleton((a, b))
  else           empty
} yield found

pairsBiggerThan[S](List(1, 2, 3, 4), 5).runList.run

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