В приведенном ниже коде я пытаюсь создать HList of Lists, но я столкнулся с ошибкой времени компиляции в последней строке этого кода:
◾ не удалось найти неявное значение для параметра кортеж: shapeless.ops.hlist.Tupler [shapeless.HList] ◾ недостаточно аргументов для метода tupled: (неявный кортеж: 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
Что дальше мне нужно сделать, так это создать кортеж из этих списков, как показано ниже:
(Список ('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))
Мне это кажется проблемой с параметром типа, но я не могу понять это из-за моих ограниченных знаний как в Scala, так и в Shapeless.
Любая помощь высоко ценится! TIA.