【发布时间】:2014-03-28 03:28:15
【问题描述】:
如此处所述
Type-safe way to divide a tuple into multiple tuples
我有一个带有以下签名的方法
def execute[T <: Record](funs: Seq[(Session) => T]): Seq[T]
其中Session 是Slick 数据库会话;这个方法的基本实现是
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) 每个都包含一个多态 T,但我正在尝试创建一个 (Session ~> T) 函数,其中 Session 是不变的,而多态 T 不包含在 Set 或 Option 等中。由于没有足够的 Shapeless 经验,我毫无疑问地以错误的方式看待这个问题。
如何使用 Shapeless 创建def execute(funs: Seq[(Session) => T]): Seq[T] 函数的多态版本?
【问题讨论】:
-
这里删除
ToList时execute的返回类型是什么?还有其他方法可以强制执行约束,但我不确定为什么这个不起作用。 -
@TravisBrown 我的错,我忘了数据库返回 Option[Record];如果我将参数更改为 ToList[0, Option[Record]] 那么它工作得很好
标签: scala polymorphism shapeless