gpt4 book ai didi

scala - 查找 Shapeless HList 的类型类实例

转载 作者:行者123 更新时间:2023-12-04 07:22:52 25 4
gpt4 key购买 nike

说我有一个特质 Show[T]例如 Scalaz 中的那个:https://github.com/scalaz/scalaz/blob/scalaz-seven/core/src/main/scala/scalaz/Show.scala#L9

我也有一个无形的HList可能看起来像 "1" :: 2 :: 3L :: HNil .

有没有办法找到Show每个元素的实例并应用 shows这样我就得到了 "1" :: "2" :: "3L" :: HNil ?

如果任何元素的类型没有隐式 Show范围内的实例我想要一个编译错误。

我认为如果我建立一个 HListShow我应该可以使用的实例 zipApply获取 HList我想要,但我不知道是否有办法让 Scala 推断 HListShow实例而不是我手工构建它。

最佳答案

如果您的目标是应用 Show实例,并且您不关心构建 HList其中,最简单的方法可能是使用多态函数:

import scalaz._, Scalaz._, shapeless._

val xs = "1" :: 2 :: 3L :: HNil

object show extends Poly1 {
implicit def forShowable[A: Show] = at[A](_.shows)
}

val strings: String :: String :: String :: HNil = xs map show

你可以得到一个 HList通过更改 Poly1 的实例一点点:
object showInstance extends Poly1 {
implicit def forShowable[A: Show] = at[A](_ => Show[A])
}

在某些情况下,定义您自己的类型类以收集您拥有某些类型类实例的证据可能很有用:
trait AllShowable[L <: HList, S <: HList] {
def instances: S
}

implicit object hnilAllShowable extends AllShowable[HNil, HNil] {
def instances = HNil
}

implicit def hlistAllShowable[H: Show, TL <: HList, TS <: HList](
implicit ts: AllShowable[TL, TS]
) = new AllShowable[H :: TL, Show[H] :: TS] {
def instances = Show[H] :: ts.instances
}

但是通常使用需要实例的多态函数进行映射会很好地工作。

关于scala - 查找 Shapeless HList 的类型类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22269325/

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