gpt4 book ai didi

scala - 无形 .toHList 的行为

转载 作者:行者123 更新时间:2023-12-01 07:47:32 25 4
gpt4 key购买 nike

编译如下:

 object Run1 extends App {

import shapeless._
import syntax.std.traversable._

case class Container[T](x: T)

Seq(Container(1), Container("x")).toHList[Container[Int] :: Container[String] :: HNil]

}

但这不是:

object Run2 extends App {

import shapeless._
import syntax.std.traversable._

class Container[T](val x: T)

Seq(new Container(1), new Container("x")).toHList[Container[Int] :: Container[String] :: HNil]

}

失败并出现以下错误:

Error:(40, 52) could not find implicit value for parameter fl: shapeless.ops.traversable.FromTraversable[shapeless.::    [com.adaje.service.table.Run2.Container[Int],shapeless.::[com.adaje.service.table.Run2.Container[String],shapeless.HNil]]]
Seq(new Container(1), new Container("x")).toHList[Container[Int] :: Container[String] :: HNil]
^

为什么第二个程序不起作用,是否可以添加任何东西使其起作用?

谢谢

最佳答案

FromTraversable 类型类需要元素类型的 Typeable 实例。 Shapeless 为案例类提供现成的这些,但不为任意定义的类提供这些。不过,您可以很容易地定义自己的:

import shapeless._, shapeless.syntax.std.traversable._

class Container[T](val x: T)

implicit def containerTypeable[A: Typeable]: Typeable[Container[A]] =
new Typeable[Container[A]] {
def cast(t: Any): Option[Container[A]] = t match {
case c: Container[_] => Typeable[A].cast(c.x).map(new Container(_))
case _ => None
}

def describe: String = s"Container[${ Typeable[A].describe }]"
}

然后:

scala> val cs = Seq(new Container(1), new Container("x"))
cs: Seq[Container[_ >: String with Int]] = List(Container@3c3c89b2, Container@1273a053)

scala> cs.toHList[Container[Int] :: Container[String] :: HNil]
res0: Option[shapeless.::[Container[Int],shapeless.::[Container[String],shapeless.HNil]]] = Some(Container@357c808b :: Container@607bcaf5 :: HNil)

还有:

scala> cs.reverse.toHList[Container[Int] :: Container[String] :: HNil]
res1: Option[shapeless.::[Container[Int],shapeless.::[Container[String],shapeless.HNil]]] = None

scalac 的 -Xlog-implicits 选项在这种情况下会很方便——它会清楚地表明您最初的非 case-class 尝试中缺少的是 Typeable 实例。

关于scala - 无形 .toHList 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37015011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com