by shigemk2

当面は技術的なことしか書かない

Free-ScalikeJDBC から見る合成可能なDSLの作り方 まとめ #関数型Scala

Free-ScalikeJDBC から見る合成可能なDSLの作り方 · GitHub

ScalikeJDBC

より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ライブラリはモナドにされたがる
  • 状態の変更が多いから…

d.hatena.ne.jp

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. 1.で作った型をFreeでラップした値を返すメソッドをつくる
  2. Interpreter つくる