2015-10-24 2 views
3

Я использую RightFolder, который возвращает Tuple2 и хотел бы вернуть часть _1. Первая версия rightFoldUntupled1 работает нормально, но использует дополнительный IsComposite тип.Shapeless deconstruct tuple в объявлении параметра типа

Во второй версии rightFoldUntupled2 я пытаюсь добиться того же без IsComposite по P, как уничтожение того, в Product2[_, Values]. Это больше не работает - компилятор с радостью засвидетельствовал, что P является Product2[_,_], но как только я использую параметр именованного типа для _1, он больше не компилируется. Любая идея почему?

Полный источник (с SBT готов ~ работать с неявной отладочный вывод) здесь: https://github.com/mpollmeier/shapeless-playground/tree/f3cf049

case class Label[A](name: String) 

val label1 = Label[Int]("a") 
val labels = label1 :: HNil 

object getValue extends Poly2 { 
    implicit def atLabel[A, B <: HList] = at[Label[A], (B, Map[String, Any])] { 
    case (label, (acc, values)) ⇒ 
     (values(label.name).asInstanceOf[A] :: acc, values) 
    } 
} 

// compiles fine 
val untupled1: Int :: HNil = rightFoldUntupled1(labels) 

// [error] could not find implicit value for parameter folder: 
// shapeless.ops.hlist.RightFolder.Aux[shapeless.::[Main.DestructureTupleTest.Label[Int],shapeless.HNil], 
//(shapeless.HNil, Map[String,Any]),Main.DestructureTupleTest.getValue.type,P] 
val untupled2: Int :: HNil = rightFoldUntupled2(labels) 

def rightFoldUntupled1[L <: HList, P <: Product2[_, _], Values <: HList](labels: L)(
    implicit folder: RightFolder.Aux[L, (HNil, Map[String, Any]), getValue.type, P], 
    ic: IsComposite.Aux[P, Values, _] 
): Values = { 
    val state = Map("a" -> 5, "b" -> "five") 
    val resultTuple = labels.foldRight((HNil: HNil, state))(getValue) 
    ic.head(resultTuple) 
} 

def rightFoldUntupled2[L <: HList, Values, P <: Product2[_, Values]](labels: L)(
    implicit folder: RightFolder.Aux[L, (HNil, Map[String, Any]), getValue.type, P] 
): Values = { 
    val state = Map("a" -> 5, "b" -> "five") 
    val resultTuple = labels.foldRight((HNil: HNil, state))(getValue) 
    resultTuple._1 
} 

ответ

4

Это должно работать так же, как rightFoldUntupled1:

def rightFoldUntupled2[L <: HList, Values, M](labels: L)(
    implicit folder: RightFolder.Aux[L, (HNil, Map[String, Any]), getValue.type, (Values, M)] 
): Values = { 
    val state = Map("a" -> 5, "b" -> "five") 
    val resultTuple = labels.foldRight((HNil: HNil, state))(getValue) 
    resultTuple._1 
} 

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

  • Нет связанных вопросов^_^