할 수 없습니다.
런타임
에서 추론을해야합니다 것은 모순이다. 형식 유추는 컴파일 시간에 만 작동합니다. 즉
, 당신은
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]
을 반환 가지고, 그리고 toHlist
는 list
구조와 수익의 런타임 유효성 검사를 수행 할 수 있습니다 : toHlist
이 유형을 필요로하는 이유가 있어요
Some
목록에 실제로이 순서대로 이러한 유형이 포함되어 있으면 그렇지 않으면 None
입니다.
달성하고자하는 것은 무엇입니까? – ziggystar
다른 사람들이 대답 했으므로'List [Parent]'로 이동하면 목록의 개별 요소에 대한 모든 컴파일 시간 정보 (HList를 만드는 데 필요함)가 사라집니다. 돌이킬 수없는 수술입니다. –
@ziggystar myHlist.filter [A]와 같은 것을 사용해야합니다. 왜냐하면 내 코드의 런타임 흐름이 다르기 때문입니다.하나의 가지에서 조건을 가질 수 있다고하자. A :: B :: C :: C는 다른 것과 완전히 다른 것이 될 수 있으므로 컴파일 타임에 형식 순서를 지정하지 않는다. 내가 정의한 각 지점은 다르게 정의 했습니까? 또는 동일한 목표를 달성하기위한 다른 방법이 있습니까? – Omid