无形HList映射

时间:2016-01-17 10:52:42

标签: scala shapeless hlist

我试试

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}

编译好。

1 个答案:

答案 0 :(得分:2)

我是一个没有形状的专家,但我相信你可以用~>>做到这一点。问题是map接受Poly,因此您需要一个返回常量的Poly函数。这就是~>>

  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]#λ]