2016-07-19 2 views
0

Рассмотрим следующее:Scala: Преобразование Sealed Trait экземпляра к HList

sealed trait baseData { 
    def weight: Int 
    def priority: Int 
} 

case class data1(override val weight: Int, override val priority: Int) extends baseData 

Как бы я определить функцию со следующей подписью, меняющих data1 в HList?

def toHlist[A <: baseData] (data: A) = {} 

Я хочу передать в черте, например в toHlist функции вместо фактического класса случае, потому что будет больше, чем один случай класса расширения черты. Я также не хочу жестко кодировать любые поля; Я ищу полностью общее решение.

Я уверен, что это выполнимо с библиотекой Shapeless, но не удалось выяснить, как это сделать.

EDIT

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

val data: baseData = data1(1,2) 
toHlist(data) 

Причина этого заключается в том, что мы будем иметь более чем один случай класс продолжается baseData, и теперь мы узнаем, какой из них должен пройти до toHlist до времени выполнения.

ответ

0

Это, вероятно, не окончательный ответ, но это поможет вам уточнить ваш вопрос,

scala> def toHlist[A <: baseData](data: A)(implicit gen: Generic[A]): gen.Repr = gen.to(data) 
toHlist: [A <: baseData](data: A)(implicit gen: shapeless.Generic[A])gen.Repr 

scala> toHlist(data1(23, 13)) 
res0: shapeless.::[Int,shapeless.::[Int,shapeless.HNil]] = 23 :: 13 :: HNil 
+0

Спасибо! Это работает с 'toHlist (data1 (23, 13))', но не будет, если мы все, что у нас есть, является указателем на базовый признак: 'val data: baseData = data1 (23,13)', 'toHlist (данные) '. В моем случае я не буду знать, какой класс класса должен пройти до выполнения. Есть идеи? –

+0

Не могли бы вы обновить свой вопрос в свете вышесказанного? –

+0

См. Выше. Благодаря! –

Смежные вопросы