7

ここに記載されているように

タプルを複数のタプルに分割するタイプセーフな方法

次のシグネチャを持つメソッドがあります

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ライブラリのHListsを使用すること(Session) => Tでした。私が見たポリモーフィック関数の例では、ラップされた型パラメーターを使用しています。たとえば(Set ~> Option)、それぞれが polymorphic をラップしていますが、が不変で、ポリモーフィックがorでラップされていない関数Tを作成しようとしています。(Session ~> T)SessionTSetOptionなど。Shapeless で十分な経験がないため、この問題を間違った方法で見ていることは間違いありません。

Shapeless を使用してdef execute(funs: Seq[(Session) => T]): Seq[T]関数のポリモーフィック バージョンを作成するにはどうすればよいですか?

4

1 に答える 1