2014-01-22 2 views
6

와 재귀 다형성 기능을 어떻게 쓸 수있다 : 이것은 주로 내가 원하는 것을 할 것 같다은 내가 간단한 재귀 다형성 기능을 쓸 수있는 무형의

object simpleRec extends Poly1 { 
    implicit def caseInt = at[Int](identity) 
    implicit def caseList[A, B](implicit ev: simpleRec.Case.Aux[A, B]) = 
    at[List[A]](_.headOption.map(simpleRec)) 
} 

을; 그러나, 나는 무의미한 결과 유형을 얻는 것 같다 :

scala> simpleRec(List.empty[List[Int]]) 
res3: Option[B] = None 

scala> simpleRec(List(List(1))) 
res4: Option[B] = Some(Some(1)) 

가 어떻게이 나에게 Option[Option[Int]]보다는 Option[B]의 값을 제공 할 수 있습니까? 나는 여기서 바보 같은 실수를 범하기를 기대하지만, 그것이 무엇인지 알 수 없다.

+0

사용. 내 재귀 대답은 "올바른 사례 유형을 제공하는 Case [A]'"를 사용했습니다. 'simpleRec (List (List (1))) : 옵션 [Option [Int]]'. –

+0

전체 코드를 붙여 넣을 수 있습니까? – nathanengineer

답변

2

이 아마 버그했다, 다음 코드는 예상대로 작동합니다

object simpleRec extends Poly1 { 
    implicit def caseInt = at[Int](identity) 
    implicit def caseList[A](implicit ev: simpleRec.Case[A]) = 
    at[List[A]](_.headOption.map(simpleRec)) 
} 

것은이 깔끔한 질문 shapeless_2.11-2.0.0