Scala Catを利用したデータベースアクセスコードの改善


何か身近なことから始めましょう.あなたがしばらくの間Scalaで働いたならば、あなたはほとんどscala.concurrent.Future#sequencescala.concurrent.Future#traverseに遭遇しました.
ここでは、これら2つのメソッドの簡単なメソッドシグネチャです.
def traverse[A, B](items: Seq[A])(f: A => Future[B]): Future[Seq[B]]
def sequence[A](items: Seq[Future[A]]): Future[Seq[A]]
cats.Traverseは、242479142の操作を具体化するが、より一般的である抽象化である.関数引数タイプscala.concurrent.Future#traverseおよび戻り値Aに加えて、BSeqの両方のコンテキスト型がさらに一般化されています.
trait Traverse[F[_]] {
  def traverse[G[_], A, B](fa: F[A])(f: A => G[B]): G[F[B]]
}
あなたがFutureの新しいバージョンを使用しているならば、あなたはslickに最もよく知られています.ある種のコレクションを持っていて、コレクション内の各要素に対してデータベースアクションを実行したい場合があります.DBIODBIOとやや似ているので、書くことができます.
def f[A](a:A): DBIO[B] = ???

val b: DBIO[Seq[B]] = DBIO.sequence(items.map(f))
または、ドキュメントの意識が不足しているならば、イベントは最後に書くことができます.
items.foldLeft(DBIO.successful(Seq()) {
  (acc, next) => acc.flatMap(a => f(next).map(i => acc :+ i)
}
しかし、我々がslickcatsを利用するならば、我々は単に書くことができます:
items.traverse(f)
しかし、適切な依存関係なしでこのアプローチを使用しようとすると、コンパイラはFutureの暗黙のインスタンスが見つからないことについて不満を言うことがわかります.
修正するには、次の依存関係を追加する必要があります.
https://github.com/RMSone/slick-cats
次のインポートをクラスに追加します.
import com.rms.miu.slickcats.DBIOInstances._
あなたがどれくらいあなたが機能的なプログラミング旅行にあるかによって、あなたは、DBIOが一つのタイプ引数でタイプ建設者を必要とする特別な種類のファンターであるということを知っているでしょう.cats.Traverseと一緒に使用したい場合は、slickcatsまたは複数の型パラメーターを持つ他の関連する型を返します.これらの状況では、コンパイラのビットをDBIOAction[+R, +S <: NoStream, -E <: Effect]に変更するか、明示的にDBIOにキャストする必要があります.
これは単なる例です.DBIOは、より読みやすいデータベースアクセスコードを書くのを助けるtypeclassインスタンスを持ちます.