ここに記載されているように
次のシグネチャを持つメソッドがあります
def execute[T <: Record](funs: Seq[(Session) => T]): Seq[T]
Slickデータベース セッションSession
はどこにありますか。このメソッドの基本的な実装は
def execute[T <: Record](funs: Seq[(Session) => T): Seq[T] = {
db withSession {
session: Session => funs.map(fun => fun(session))
}}
(ここでdb
は Slick Database
) と、ロギング、キャッシング、マルチスレッドなどを追加する他の実装を使用します。特に、マルチスレッド実装では、funs.grouped(ceil(funs.size / threadCount)).map(funs => Future {})
複数のスレッド間で関数を分割するために使用されます。
さまざまな型の値を返すことができるように、関数のタプルを受け入れるメソッドのバージョンを作成したいと思います-上記のリンクされた質問で説明されているように、タプルをより小さなものに分割する良い方法を知りませんでしたタプルを作成し、マルチスレッドの場合の結果を再結合しますが、その質問に対する答えはShapelessライブラリのHList
sを使用すること(Session) => T
でした。私が見たポリモーフィック関数の例では、ラップされた型パラメーターを使用しています。たとえば(Set ~> Option)
、それぞれが polymorphic をラップしていますが、が不変で、ポリモーフィックがorでラップされていない関数T
を作成しようとしています。(Session ~> T)
Session
T
Set
Option
など。Shapeless で十分な経験がないため、この問題を間違った方法で見ていることは間違いありません。
Shapeless を使用してdef execute(funs: Seq[(Session) => T]): Seq[T]
関数のポリモーフィック バージョンを作成するにはどうすればよいですか?