2014-12-12 4 views
4

다른 유형의 일반 목록을 갖고 싶습니다. 특정 유형의 객체를 가져오고 싶습니다.목록의 HList 런타임 변환

val list:List[Parent] = A() :: B() :: C() :: C() ::Nil //or any size or ordering 

내가이의 Hlist, B, C, C 런타임이 캐스팅 할 : 나는 다른 크기와 다른 목록을 정의 할 수 있습니다

trait Parent 
case class A() extends Parent 
case class B() extends Parent 
case class C() extends Parent 

:

나는이 구조 . .toHlist []는 런타임에 유추되어야하는 요소 유형을 필요로합니다. 무형의 방법은 무엇입니까? 그것을 튜플로 변환 할 방법이 있습니까?

+0

달성하고자하는 것은 무엇입니까? – ziggystar

+0

다른 사람들이 대답 했으므로'List [Parent]'로 이동하면 목록의 개별 요소에 대한 모든 컴파일 시간 정보 (HList를 만드는 데 필요함)가 사라집니다. 돌이킬 수없는 수술입니다. –

+0

@ziggystar myHlist.filter [A]와 같은 것을 사용해야합니다. 왜냐하면 내 코드의 런타임 흐름이 다르기 때문입니다.하나의 가지에서 조건을 가질 수 있다고하자. A :: B :: C :: C는 다른 것과 완전히 다른 것이 될 수 있으므로 컴파일 타임에 형식 순서를 지정하지 않는다. 내가 정의한 각 지점은 다르게 정의 했습니까? 또는 동일한 목표를 달성하기위한 다른 방법이 있습니까? – Omid

답변

3

할 수 없습니다.

런타임

에서 추론을해야합니다 것은 모순이다. 형식 유추는 컴파일 시간에 만 작동합니다. 즉

, 당신은

val list: A :: B :: C :: C :: HNil = ... 

list 변수의 유형이 컴파일 시간에 알려진 같은 물품. 런타임에 변수에 유형을 할당하는 것은 불가능합니다. 단지 의미가 없습니다. 이 가능할 것이다 가정, 당신은 마법의 방법 toHlistMagical 것 :

val list: List[Parent] = A() :: B() :: C() :: C() :: Nil 
val hlist = list.toHlistMagical // infers to A :: B :: C :: C :: HNil 

지금의이 조금을 변경할 수를 :

이 기능을 가지고 당신이 기대하는 형식을 반환 지금의
def getHlist(list: List[Parent]) = list.toHlistMagical 

? 이 다양한 목록을 호출 할 수 있다는 것을 명심뿐만 아니라 순서로 A, B, C, C 인스턴스를 포함 할 것들 :

getHlist(C() :: B() :: A() :: A() :: Nil) 

그것은있을 수 Any,하지만 당신은 어쨌든 List로 갈 수 있습니다 더 이상 HList이 없으므로 여분의 유형 안전을 얻지 못합니다. 당신은 당신이 원하는 정확한 유형을 지정했기 때문에

def getHlist(list: List[Parent]) = list.toHlist[A :: B :: C :: C :: HNil] 

getHlist 지금 형 Option[A :: B :: C :: C :: HNil]을 반환 가지고, 그리고 toHlistlist 구조와 수익의 런타임 유효성 검사를 수행 할 수 있습니다 : toHlist이 유형을 필요로하는 이유가 있어요

Some 목록에 실제로이 순서대로 이러한 유형이 포함되어 있으면 그렇지 않으면 None입니다.

관련 문제