2014-11-26 3 views
4

Есть ли способ, чтобы преобразовать вектор типа Any в бесформенную HList (productelement)Вектор Любой до бесформенных HList

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) 

Based на руководство Shapless миграции, можно с типизированных кортежей

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?

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

ответ

7

Да, это возможно, но вы должны указать типы, и поскольку это слепок, который может потерпеть неудачу во время выполнения, вы получите результаты, завернутые в 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.

+0

Есть ли способ вывести типы? Причина, чтобы спросить, что я пытаюсь отобразить SQL результаты запроса HList результатов SQL запросов основаны на критериях отбора, т.е. 'выбрать, б, из таблицы выберите * из таблицы выберите B, C из таблицы « Результаты в этих случаях могут меняться, а текущий результат представлен как « Вектор (вектор, x, x, x)), вектор (x, x, x,)) – user2780187