scala - 如何映射扩展共同特征的对象的 Hlist?
问题描述
我有一个特征和扩展它的对象。
trait Common[K] {
def name: String
def encode(k: K): String = name + k.toString
}
object A extends Common[Int] {
override def name: String = "a"
}
object B extends Common[Int] {
override def name: String = "b"
}
object C extends Common[Int] {
override def name: String = "c"
}
我想创建这个对象的 hlist 并映射它:
val hl = A :: B :: C :: HNil
val result: List[Int => String] = hl.map(EncodePoly).toList
以及实现 Poly 功能的不同尝试:
object EncodePoly extends Poly1 {
implicit def indCase[K]: Case.Aux[Common[K], K => String] = at[Common[K]] {
common => k =>
common.encode(k)
}
}
object EncodePoly extends Poly1 {
implicit def indCase[K, C <: Common[K]]: Case.Aux[C, K => String] = at[C] {
common => k =>
common.encode(k)
}
}
编译器告诉我:
错误:(45, 43) 找不到参数映射器的隐式值:shapeless.ops.hlist.Mapper[com.test.EncodePoly.type,com.test.A.type :: com.test.B.type :: com.test.C.type :: shapeless.HNil] val 结果:List[Int => String] = hl.map(EncodePoly).toList
我还尝试将依赖类型用于共同特征而不是类型参数。似乎没有任何效果。我应该如何使用对象列表?
解决方案
你的第二个EncodePoly
很接近,但编译器不够聪明,无法推断K
应该是Int
然后C
应该是单例类型。<:<
您可以通过使用而不是编码子类型关系来帮助类型推断<:
:
trait Common[K] {
def name: String
def encode(k: K): String = name + k.toString
}
object A extends Common[Int] {
override def name: String = "a"
}
object B extends Common[Int] {
override def name: String = "b"
}
object C extends Common[Int] {
override def name: String = "c"
}
import shapeless.{ ::, HNil, Poly1 }
object EncodePoly extends Poly1 {
implicit def indCase[K, C](implicit ev: C <:< Common[K]): Case.Aux[C, K => String] = at[C] {
common => k => common.encode(k)
}
}
接着:
scala> val hl = A :: B :: C :: HNil
hl: A.type :: B.type :: C.type :: shapeless.HNil = A$@3f044518 :: B$@282b7aad :: C$@7c130749 :: HNil
scala> val result: List[Int => String] = hl.map(EncodePoly).toList
result: List[Int => String] = List(EncodePoly$$$Lambda$5555/1493211716@7c987ea3, EncodePoly$$$Lambda$5555/1493211716@10be689, EncodePoly$$$Lambda$5555/1493211716@5dd3c2f2)
如果您可以在定义中修复K
,Int
那EncodePoly
也可以。
推荐阅读
- service - Google Play 服务无法运行,因为 Firebase 创建了另一个 oath 客户端 ID
- java - 重置 If 语句 (?)
- wordpress-gutenberg - Wordpress Gutenberg withSelect get list of post types
- javascript - Firebase Realtime - 云函数 TypeError:无法读取 null 的属性“男性”
- python - 制作一个可以同时运行两个 Python 脚本的 Python 脚本
- c++ - 我如何分别创建和启动我的线程
- postgresql - 如何在 Postgres 中查询 & 符号
- python - 如何将 (100,) 的 numpy 数组重塑为 (250,100)
- virtualbox - ovs tap "internal" vs tuntap tap
- acumatica - 设置表单标题运行时