【问题标题】:Mapping tuples in shapeless HList在无形 HList 中映射元组
【发布时间】:2016-01-19 20:36:21
【问题描述】:

你会的

  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

被编译器拒绝。你做什么工作?哪里可以学的?

【问题讨论】:

    标签: scala shapeless hlist map-function


    【解决方案1】:
    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))
    

    附:另请注意,您的代码示例无法编译。你在第一部分错过了[T],你需要使用~>,而String -> List在最后一部分是scala中的错误类型。 List 是类型构造函数,不是类型,不能这样使用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-04
      • 2017-02-10
      • 1970-01-01
      • 2014-09-15
      • 2019-04-08
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      相关资源
      最近更新 更多