const K = <A, B>(a: A) => (_b: B) => a;
const S = <A, B, C>(a: (x: C) => (y: B) => A) => (b: (x: C) => B) => (c: C) => a(c)(b(c));
const Z = S(K(S(S(K)(K))(S(K)(K))))(S(S(K(S))(K))(K(S(K(S(S)(S(K))))(S(S(K(S))(K))(K)))));
https://en.wikipedia.org/wiki/Fixed-point_combinator eff Pick {
def pick(): Int32
}
def body(): (Int32, Int32, Int32) \ Pick = {
let a = Pick.pick();
let b = Pick.pick();
let c = Pick.pick();
(a, b, c)
}
def handlePick(f: Unit -> a \ ef): List[a] \ ef - Pick =
run {
f() :: Nil
} with handler Pick {
def pick(_, resume) =
resume(1) ::: resume(2) ::: resume(3)
}
def main(): Unit \ IO =
println(handlePick(body))