scala - 无形中的副产品不编译
问题描述
我正在尝试shapeless
并正在尝试了解Generic
Coproducts。这是我尝试过的:
object ShapelessExperiments {
final case class Test1()
final case class Test2()
final case class Test3()
type Test = Test1 :+: Test2 :+: Test3 :+: CNil
val t1: Test = Inr(Inl(Test2())) //fine
val t2: Test = Generic[Test].to(Test2()) //compile error
}
我希望val t2
与 完全相同val t1
,但不幸的是它甚至没有编译:
Error:(13, 25) could not find implicit value for parameter gen: shapeless.Generic[com.test.ShapelessExperiments.Test]
val t2: Test = Generic[Test].to(Test2())
Error:(13, 25) not enough arguments for method apply: (implicit gen: shapeless.Generic[com.test.ShapelessExperiments.Test])shapeless.Generic.Aux[com.test.ShapelessExperiments.Test,gen.Repr] in object Generic.
Unspecified value parameter gen.
val t2: Test = Generic[Test].to(Test2())
这个错误确实不是很清楚,对我有帮助。你能解释一下最后一个案例出了什么问题吗?
解决方案
我想你正在寻找Inject
:
import shapeless._
import shapeless.ops.coproduct.Inject // for converter object
import shapeless.syntax.inject._ // for nice syntax
object ShapelessExperiments extends App {
final case class Test1()
final case class Test2()
final case class Test3()
type Test = Test1 :+: Test2 :+: Test3 :+: CNil
val t1: Test = Inr(Inl(Test2())) //fine
val t2: Test = Inject[Test, Test2].apply(Test2())
val t3: Test = Test2().inject[Test]
println(t1 == t2) // true
println(t1 == t3) // true
}
Generic[A]
目的是不同的:它说它A
是同构的(可以相互转换,没有任何数据丢失)到某种类型B
,B
通常是一个HList
(如果A
是案例类)或一个Coproduct
(如果A
是密封的特征)。
A
当is anHList
或 a Coproduct
itself (source)时,这些实例不可用。
推荐阅读
- javascript - 使用 vanilla js 进行滚动样式更改
- python - Pandas 和 Python 中更高效的迭代
- c++ - 如何在结构的向量上使用 lower_bound?
- python - 请在我尝试过的以下代码中帮助我,但它给出错误“驱动程序无法识别指定的命令参数”
- django - 如何找出正在运行的 mange.py?
- php - 我正在尝试使用 laravel 在我的架构中进行外键约束,但它没有反映在 phpmyadmin
- azure-databricks - Azure Data Bricks 诊断设置的 ARM 模板
- kubernetes - 为什么 kubernetes 不允许更新 RoleBinding 的 RoleRef?
- sql - GROUPS 和 NULL 的 COUNT 不等于表中的总行数
- android-storage - Play 控制台应用被拒绝。问题:不是核心功能