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

Это аккуратный вопрос. Моим рефлексивным ответом было «просто использовать« Случай [A] », который даст вам правильный выводный тип, но это делает странный материал, например. 'simpleRec (List (List (1))): Option [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

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