Free-ScalikeJDBC から見る合成可能なDSLの作り方 · GitHub
よりSQLっぽく書けるScala用JDBCライブラリ
サンプル
val (p, c) = (Programmer.syntax("p"), Company.syntax("c")) val programmers: Seq[Programmer] = DB.readOnly { implicit session => withSQL { select .from(Programmer as p) .leftJoin(Company as c).on(p.companyId, c.id) .where.eq(p.isDeleted, false) .orderBy(p.createdAt) .limit(10) .offset(0) }.map(Programmer(p, c)).list.apply() }
- DBライブラリはモナドにされたがる
- 状態の変更が多いから…
Freeモナド
Free モナドとは、Functor を ベースに Monad を作れる構造
前提知識 Scalaz勉強会 主要な型クラスの紹介 · GitHub
Coyoneda scalaz/Coyoneda.scala at 7bbe2669267e992dc96d8e0e7e9e5d7c54a70033 · scalaz/scalaz · GitHub
Coproduct を利用した Free モナドの合成 d.hatena.ne.jp
natural transformation 自然変換 - Wikipedia
まとめ
- -> * kind の型をつくる
- 1.で作った型をFreeでラップした値を返すメソッドをつくる
- Interpreter つくる