Scala Catを利用したデータベースアクセスコードの改善
6007 ワード
何か身近なことから始めましょう.あなたがしばらくの間Scalaで働いたならば、あなたはほとんど
ここでは、これら2つのメソッドの簡単なメソッドシグネチャです.
修正するには、次の依存関係を追加する必要があります.
https://github.com/RMSone/slick-cats
次のインポートをクラスに追加します.
これは単なる例です.
scala.concurrent.Future#sequence
とscala.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
に加えて、B
とSeq
の両方のコンテキスト型がさらに一般化されています.trait Traverse[F[_]] {
def traverse[G[_], A, B](fa: F[A])(f: A => G[B]): G[F[B]]
}
あなたがFuture
の新しいバージョンを使用しているならば、あなたはslick
に最もよく知られています.ある種のコレクションを持っていて、コレクション内の各要素に対してデータベースアクションを実行したい場合があります.DBIO
はDBIO
とやや似ているので、書くことができます.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インスタンスを持ちます.Reference
この問題について(Scala Catを利用したデータベースアクセスコードの改善), 我々は、より多くの情報をここで見つけました https://dev.to/senjinhajrulahovic/utilizing-scala-cats-to-improve-database-access-code-e4lテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol