【发布时间】:2016-11-07 17:20:51
【问题描述】:
在下面的代码中,我试图创建一个 HList 列表,但我在该代码的最后一行遇到编译时错误:
◾找不到参数 tupler 的隐式值: shapeless.ops.hlist.Tupler[shapeless.HList] ◾没有足够的参数 元组方法:(隐式元组: shapeless.ops.hlist.Tupler[shapeless.HList])tupler.Out.未指定 值参数元组。
object Problem extends App {
def combinations[T](n: Int, ls: List[T]) = {
import shapeless._
import HList._
def prepareHListR(t: Int, result: HList): HList = t match {
case t if (t == 0) => result
case _ => prepareHListR(t - 1, rotateLeft(t - 1, ls) :: result)
}
prepareHListR(n, HNil)
}
def rotateLeft[A](i: Int, xs: List[A]) = {
val rot = if (i > 0) i else xs.length + i
xs.drop(rot) ++ xs.take(rot)
}
println(combinations(3, List('a, 'b, 'c, 'd, 'e, 'f)))
}
输出:
List('a, 'b, 'c, 'd, 'e, 'f) :: List('b, 'c, 'd, 'e, 'f, 'a) :: List(' c, 'd, 'e, 'f, 'a, 'b) :: HNil
接下来我需要做的是创建这些列表的元组,如下所示:
(List('a, 'b, 'c, 'd, 'e, 'f), List('b, 'c, 'd, 'e, 'f, 'a), List('c , 'd, 'e, 'f, 'a, 'b))
我正在尝试:
combinations(3, List('a, 'b, 'c, 'd, 'e, 'f)).tupled
然而,这种方法在 REPL 上运行良好:
scala> import shapeless._
import shapeless._
scala> import HList._
import HList._
scala> val hlist = List(1, 2, 3) :: List(4, 5, 6) :: List(7, 8, 9) :: HNil
hlist: shapeless.::[List[Int],shapeless.::[List[Int],shapeless.::[List[Int],shapeless.HNil]]] = List(1, 2, 3) :: List(4, 5, 6) :: List(7, 8, 9) :: HNil
scala> val t =hlist.tupled
t: (List[Int], List[Int], List[Int]) = (List(1, 2, 3),List(4, 5, 6),List(7, 8, 9))
对我来说,这似乎是 type parameter 的一个问题,但由于我对 Scala 和 Shapeless 的了解有限,我无法理解它。
非常感谢任何帮助! TIA。
【问题讨论】:
-
对,您可能缺少一个类型参数(以及一个隐含的证据)。如果您可以提供一个完整的示例(包含导入和所有定义),那么诊断会更容易。
-
@TravisBrown 感谢您的回复。我已经用工作代码和进一步的解释更新了帖子。
标签: scala tuples shapeless hlist