【问题标题】:Unable to map on HList无法映射到 HList
【发布时间】:2012-07-11 15:34:12
【问题描述】:

我试图用无形解决this problem。但是由于某种原因,我无法映射到HList。我会让代码自己说话。

import shapeless._
import HList._

case class Foo(a: Option[Int], b: Option[Int])

val a = Foo(Some(3), None)

val b = Foo(Some(22), Some(1))

implicit val fooIso = HListIso(Foo.apply _, Foo.unapply _)

val mapper = new (({ type O2[+A] = (Option[A], Option[A]) })#O2 ~> Option) {
  def apply[A](x: (Option[A], Option[A])): Option[A] = x._1.orElse(x._2)
}

fooIso.fromHList(fooIso.toHList(a).zip(fooIso.toHList(b)).map(mapper))

错误信息是:

<console>:55: error: could not find implicit value for parameter mapper: shapeless.Mapper[java.lang.Object with shapeless.~>[[+A](Option[A], Option[A]),Option],shapeless.::[(Option[Int], Option[Int]),shapeless.::[(Option[Int], Option[Int]),shapeless.HNil]]]
              fooIso.fromHList(fooIso.toHList(a).zip(fooIso.toHList(b)).map(mapper))
                                                                           ^

为什么映射不起作用?

【问题讨论】:

    标签: scala type-systems shapeless


    【解决方案1】:

    有一个简单的解决方法:只需将您的函数定义为 object 而不是 val:

    object f extends (({ type O2[+A] = (Option[A], Option[A]) })#O2 ~> Option) {
      def apply[A](x: (Option[A], Option[A])): Option[A] = x._1 orElse x._2
    }
    

    (请注意,我将函数命名为f 而不是mapper,以避免与map 的mapper 隐式参数混淆。)

    我不确定我是否能提供帮助为什么——在某些时候,我试图弄清楚为什么 val 在 Shapeless 中对这种事情不起作用的细节,我不记得我走了多远。

    【讨论】:

    • Poly1(以及 ~>)的实现依赖于能够命名一个与正在定义的类函数实体相对应的单例类型,因为它正在被定义。当实体是一个对象并且值在创建稳定标识符的同时实例化时,这会顺利进行;但在这两者分开的地方并不是那么顺利(通过显式 new 实例化并通过 val 定义创建稳定标识符)。这有某种意义,但我不能指出规范中的文本是合理的......如果其他人可以,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 2017-02-10
    • 1970-01-01
    • 2015-12-03
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多