gpt4 book ai didi

scala - 使用裸类型参数创建一个无形的多态函数

转载 作者:行者123 更新时间:2023-12-04 15:34:19 25 4
gpt4 key购买 nike

如此处所述

Type-safe way to divide a tuple into multiple tuples

我有一个具有以下签名的方法

def execute[T <: Record](funs: Seq[(Session) => T]): Seq[T]

哪里 SessionSlick数据库 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)每个包裹一个多态 T ,但我正在尝试创建一个 (Session ~> T)函数 where Session是不变的和多态的 T没有包裹在 SetOption等等。由于对 Shapeless 没有足够的经验,我无疑以错误的方式看待这个问题。

如何使用 Shapeless 创建 def execute(funs: Seq[(Session) => T]): Seq[T] 的多态版本功能?

最佳答案

您实际上并不真正需要或想要这里的多态函数——您可以从 Shapeless 提供的一些开箱即用的类型类中获得您正在寻找的东西。它看起来有点奇怪,但实际上并没有那么复杂(请注意,我使用的是 Shapeless 2.0——你可以在 1.2.4 中这样做,但它会更困惑):

import shapeless._, ops.tuple.{ ConstMapper, ToList, ZipApply }
import shapeless.syntax.std.tuple._

def execute[F <: Product, S, O](funs: F)(implicit
cm: ConstMapper.Aux[F, Session, S],
za: ZipApply.Aux[F, S, O],
tl: ToList[O, Record]
): O = db withSession { session: Session =>
funs.zipApply(funs.mapConst(session))
}

我们基本上只是在我们的 session 中,通过重复输入的次数来创建一个新的元组,用这个新的 session 元组压缩输入元组,然后将每个压缩元素的第一部分应用到第二部分. ToList部分要求结果元组的所有元素都是 Record 的子类型.

为了一个完整的工作示例,这里有一些简单的演示定义:
type Session = String
trait Record
case class RecordX(s: String) extends Record
case class RecordY(i: Int) extends Record

def x(s: Session) = RecordX(s)
def y(s: Session) = RecordY(s.size)

object db {
def withSession[T](f: Session => T) = f("foo")
}

它有效!
scala> execute((x _, y _))
res0: (RecordX, RecordY) = (RecordX(foo),RecordY(3))

我们得到一个很好的适当静态类型的元组作为我们的结果。

关于scala - 使用裸类型参数创建一个无形的多态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22418309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com