【问题标题】:shapeless HList mapping无形 HList 映射
【发布时间】:2016-01-17 19:07:52
【问题描述】:

我试试

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}

编译正常。

【问题讨论】:

    标签: scala shapeless hlist


    【解决方案1】:

    我不是无形的专家,但我相信您可以通过 ~>> 做到这一点。问题是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]#λ]
    

    【讨论】:

    • 如果我想映射HList[String -> F[_]]怎么办?无害转换fun(List ~>> Int) => fun((String -> List) ~>> Int) 被编译器拒绝。
    • @ValentinTihomirov 不确定我是否理解正确,但您应该扩展 PolyN 以获得更复杂的场景。见github.com/milessabin/shapeless/wiki/…,段落结尾,其中object size 被定义
    猜你喜欢
    • 2023-03-04
    • 2017-02-10
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    相关资源
    最近更新 更多