gpt4 book ai didi

scala - 如何映射扩展共同特征的对象列表?

转载 作者:行者123 更新时间:2023-12-04 15:06:01 25 4
gpt4 key购买 nike

我有一个特征和扩展它的对象。

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)
}
}

编译器告诉我:

Error:(45, 43) could not find implicit value for parameter mapper: shapeless.ops.hlist.Mapper[com.test.EncodePoly.type,com.test.A.type :: com.test.B.type :: com.test.C.type :: shapeless.HNil] val result: List[Int => String] = hl.map(EncodePoly).toList



我还尝试将依赖类型用于共同特征而不是类型参数。似乎没有任何效果。我应该如何处理对象的 hlist?

最佳答案

您的第二个 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)

如果你能修复 KInt在您的 EncodePoly定义,那也行。

关于scala - 如何映射扩展共同特征的对象列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56595504/

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