2013-12-15 2 views
2

그래서지도 기능을 HList 이상으로 만들고 싶었지만 적용 기능 내에서 몇 가지 조건을 확인해야합니다. 매끄러운처럼 : 결과로폴리 함수, 스칼라에서 타입 소거

object test extends Poly1 { 
    implicit def default[L <: HList](implicit head: ops.hlist.IsHCons[L]) = 
    at[L](t => { 
     if(true) t.head else false //here some condition  
    }) 
} 

, 우리는 t.head 요소의 type에 대한 모든 정보를 잃게; btw 우리가 "깨끗한"기능을 구축하는 경우 :

object test extends Poly1 { 
    implicit def default[L <: HList](implicit head: ops.hlist.IsHCons[L]) = 
    at[L](t => t.head) 
} 

그렇다면 모두 괜찮습니다.

그래서 문제는 어떻게 처리하고 그런 종류의 기능을 만들 수 있습니까 (가능한 경우) 또는 다른 방법으로 검색해야합니까? 왜 여기에 문자를 지울 수 있습니까?

답변

4

문제는 형식 지우기가 아니거나 Shapeless와 관련하여 까다로운 작업이 아닙니다. 조건부 표현의 유추 된 유형이 두 가지 유형의 최소 상한이고이 경우는 Any입니다. 그것은 HList의 구조에 일치하는 대신 인스턴스를 필요로하는 좀 더 우아 (그리고 관용적) 것, 보조 노트로

scala> def foo[A](a: A) = if (true) a else false 
foo: [A](a: A)Any 

: 당신은 같은 일이 보통 오래된 다형성 방법으로 일어날 볼 수 있습니다 IsHCons 형 클래스의 :

object test extends Poly1 { 
    implicit def default[H, T <: HList] = at[H :: T](_.head) 
} 

이것은 당신의 "깨끗한"예를 들어 똑같은 일을한다.

+0

오, 알 겠어. 만약 내가 다음과 같이 쓰면 :''[L] (if (true) t => t.head else t => false)'나는 Any를 얻을 것이다. 모든 기능 유형의 원인? 내가 생각하기에 ... Thx는 'head'사용법, btw에 대한 멋진 참고 사항으로 다른 모든 암시 (map, flat map, diff custom helpers 등)를 전달하지 않는 것이 좋습니다. : D – DaunnC

+0

오프 나는 완전히 이해했다! 너는 이제 나에게 분명하다. – DaunnC