在无形 HList 中映射元组
Mapping tuples in shapeless HList
你做
import shapeless._ ; import poly._
object fun extends (List ~>> (List, Int)) {
override def apply[T](list: List[T]): (List, Int) = list -> list.size
}
println((List(1,2,3) :: List("a", "b", "c") :: HNil).map(fun))
将每个子列表映射成一对。但是,如果 HList 元素更复杂,例如元组,该怎么办?自然的尝试
object fun extends ((String -> List) ~>> (List, Int)) {
override def apply[T](list: (String -> List[T])): (List, Int) = list -> list.size
被编译器拒绝。你做什么工作?哪里可以学?
import shapeless._
import poly._
object fun2 extends Poly1 {
implicit def caseTuple[T] =
at[(String, List[T])](x => (x._2.tail, x._1.toInt))
}
然后:
println((("56", List(1,2,3)) :: ("78", List(4,2,3)) :: HNil).map(fun))
或者,如果你想用原来的 ~>
来做,它仍然是可能的,但看起来很难看:
object fun3 extends (({type L[T] = (String, List[T])})#L ~> ({type L[T] = (List[T], Int)})#L) {
override def apply[T](f: (String, List[T])): (List[T], Int) = f match {
case (str, list) => (list.tail, str.toInt)
}
}
println((("56", List(1,2,3)) :: ("78", List(4,2,3)) :: HNil).map(fun3))
P.S。另请注意,您的代码示例无法编译。您在第一部分中错过了 [T]
,您需要在最后一部分中使用 ~>
并且 String -> List
是 scala 中的错误类型。 List
是类型构造函数,不是类型,不能这样使用
你做
import shapeless._ ; import poly._
object fun extends (List ~>> (List, Int)) {
override def apply[T](list: List[T]): (List, Int) = list -> list.size
}
println((List(1,2,3) :: List("a", "b", "c") :: HNil).map(fun))
将每个子列表映射成一对。但是,如果 HList 元素更复杂,例如元组,该怎么办?自然的尝试
object fun extends ((String -> List) ~>> (List, Int)) {
override def apply[T](list: (String -> List[T])): (List, Int) = list -> list.size
被编译器拒绝。你做什么工作?哪里可以学?
import shapeless._
import poly._
object fun2 extends Poly1 {
implicit def caseTuple[T] =
at[(String, List[T])](x => (x._2.tail, x._1.toInt))
}
然后:
println((("56", List(1,2,3)) :: ("78", List(4,2,3)) :: HNil).map(fun))
或者,如果你想用原来的 ~>
来做,它仍然是可能的,但看起来很难看:
object fun3 extends (({type L[T] = (String, List[T])})#L ~> ({type L[T] = (List[T], Int)})#L) {
override def apply[T](f: (String, List[T])): (List[T], Int) = f match {
case (str, list) => (list.tail, str.toInt)
}
}
println((("56", List(1,2,3)) :: ("78", List(4,2,3)) :: HNil).map(fun3))
P.S。另请注意,您的代码示例无法编译。您在第一部分中错过了 [T]
,您需要在最后一部分中使用 ~>
并且 String -> List
是 scala 中的错误类型。 List
是类型构造函数,不是类型,不能这样使用