Вектор HList от любого до бесформенного

Есть ли способ преобразовать вектор типа Any в Shapeless HList (productelement)

val frame = Vector(Vector(1,"a","b",false),Vector(2,"y","z",false),Vector(3,"p","q",true))

frame.map(_.hlisted) or frame.map(_.productElements)

Я пытаюсь преобразовать в следующую структуру

List[Int :: String :: String :: Boolean :: HNil](1 :: a :: b :: false :: HNil, 2 :: y :: z :: false :: HNil, 3 :: p :: q :: true :: HNil)

Основываясь на руководстве по Shapless Migration, это возможно с типизированными кортежами

https://github.com/milessabin/shapeless/wiki/Migration-guide:-shapeless-1.2.4-to-2.0.0#productelements-is-the-new-name-for-hlisted

import shapeless._
import syntax.std.product._  // New import

scala> (23, "foo", true).productElements // was '.hlisted'
res0: Int :: String :: HNil = 23 :: foo :: true :: HNil

Возможно ли это с нетипизированными векторами или, возможно, вектором -> Типизированные кортежи -> HList?

заранее спасибо


person user2780187    schedule 26.11.2014    source источник


Ответы (1)


Да, это возможно, но вы должны указать типы, и, поскольку это приведение может завершиться ошибкой во время выполнения, вы получите результаты, заключенные в Option:

import shapeless._, syntax.std.traversable._

val hlists = frame.map(_.toHList[Int :: String :: String :: Boolean :: HNil])

Теперь hlists имеет тип Vector[Option[Int :: String :: String :: Boolean :: HNil]], и в данном случае все преобразования успешны, поэтому все они заключены в Some.

person Travis Brown    schedule 26.11.2014
comment
Есть ли способ вывести типы? Причина, по которой я спрашиваю, заключается в том, что я пытаюсь сопоставить результаты sql-запроса с HList. Результаты SQL-запроса основаны на критериях выбора, т.е. select a,b,c from table select * from table select b,c from table Результаты в этих случаях могут отличаться, и текущая строка результатов представлена ​​как Vector(Vector(x,x,x..), Vector(x,x,x,)) - person user2780187; 27.11.2014