Algebraic Effect

  • Scala ZIO
ZIO[-R, +E, +A]
R: 環境(Requirement)を表す
E: 失敗 Failure Type
A: 成功 Success Type
 
R => Either[E, A]
import kyo.*
 
val a: Unit < IO =
    IO(println("hello"))
 
def example2(
    a: Int < IO,
    b: Int < Abort[Exception]
): Int < (IO & Abort[Exception]) =
    a.map(v => b.map(_ + v))
 
val a: Int < (Abort[String] & Env[Int]) =
    for
        v <- Abort.get(Right(42))
        e <- Env.get[Int]
    yield v + e
trait Database:
    def count: Int < IO
 
val a: Database < Env[Database] =
    Env.get[Database]
 
val b: Int < (Env[Database] & IO) =
    a.map(_.count)
 
val db = new Database:
    def count = 1
 
val c: Int < IO =
    Env.run(db)(b)

参考文献