Slide 102
Slide 102 text
taglessのインタプリタはそれぞれが別のReprを持っている
102
trait QuerySym:
type Repr[+_]
def table[A](name: String): Repr[List[A]]
def map[A, B](src: Repr[A], f: A => B): Repr[B]
def flatMap[A, B](src: Repr[A], f: A => Repr[B]): Repr[B]
def filter[A](src: Repr[A], p: A => Boolean): Repr[A]
def union[A](left: Repr[A], right: Repr[A]): Repr[A]
def empty[A]: Repr[A]
object EvalInterpreter extends QuerySym:
type Repr[+A] = () => List[A]
def table[A](name: String): () => List[List[A]] = () =>
List(db.getOrElse(name, Nil).asInstanceOf[List[A]])
def map[A, B](src: () => List[A], f: A => B): () => List[B] =
() => src().map(f)
(以下略)
class WriterInterpreter(
base: QuerySym { type Repr[+X] = Fusion[X] }) extends QuerySym:
type Repr[+A] = WriterFusion[A]
private inline def add(msg: String, xs: List[String]) = xs :+ msg
def table[A](name: String): WriterFusion[List[A]] =
WriterFusion(base.table(name), List(s"table($name)"))
def map[A, B](src: WriterFusion[A], f: A => B): WriterFusion[B] =
WriterFusion(base.map(src.ir, f), add("map", src.log))
(以下略)
type Repr[+A] = () => List[A]
type Repr[+A] = WriterFusion[A]