无形 HList 映射
shapeless HList mapping
我试试
import shapeless._
val ilist = List(1,2,3) ;
val slist = List("a", "b", "c") ;
(ilist :: slist :: HNil).map(list: List[_] => list -> list.length)
并且编译器说它需要 map 函数中的参数类型,或者在提供类型 List[_]
时找不到 list
值。有没有映射的简单例子?
普通的 Scala 列表没有这样的问题
val list1 = 1 :: 2 :: Nil; val list2 = 3 :: 4 :: Nil
(list1 :: list2 :: Nil) map {list => list -> list.length}
编译正常。
我不是一个无形的专家,但我相信你可以用 ~>>
做到这一点。问题是 map
接受 Poly
,所以你需要一个 Poly
函数,returns 是一个常量。这就是 ~>>
的意思。
import shapeless._
import poly._
val ilist = List(1,2,3) ;
val slist = List("a", "b", "c") ;
object fun extends (List ~>> Int) {
override def apply[T](f: List[T]): Int = f.size
}
println((ilist :: slist :: HNil).map(fun))
请注意,~>>
实际上是:
type ~>>[F[_], R] = ~>[F, Const[R]#λ]
我试试
import shapeless._
val ilist = List(1,2,3) ;
val slist = List("a", "b", "c") ;
(ilist :: slist :: HNil).map(list: List[_] => list -> list.length)
并且编译器说它需要 map 函数中的参数类型,或者在提供类型 List[_]
时找不到 list
值。有没有映射的简单例子?
普通的 Scala 列表没有这样的问题
val list1 = 1 :: 2 :: Nil; val list2 = 3 :: 4 :: Nil
(list1 :: list2 :: Nil) map {list => list -> list.length}
编译正常。
我不是一个无形的专家,但我相信你可以用 ~>>
做到这一点。问题是 map
接受 Poly
,所以你需要一个 Poly
函数,returns 是一个常量。这就是 ~>>
的意思。
import shapeless._
import poly._
val ilist = List(1,2,3) ;
val slist = List("a", "b", "c") ;
object fun extends (List ~>> Int) {
override def apply[T](f: List[T]): Int = f.size
}
println((ilist :: slist :: HNil).map(fun))
请注意,~>>
实际上是:
type ~>>[F[_], R] = ~>[F, Const[R]#λ]