gpt4 book ai didi

scala - 如何映射 Nat 的无形 HList

转载 作者:行者123 更新时间:2023-12-05 01:03:18 28 4
gpt4 key购买 nike

我有一个 Nat 的 HList,我想映射它

object NatToString extends Poly1 {
implicit def caseNat = at[Nat](_.toString)
}

val list = _5 :: _3 :: HNil
list.map(NatToString)

此代码不会编译并抛出:

could not find implicit value for parameter mapper:
shapeless.ops.hlist.Mapper[Main.Nat_to_String.type,shapeless.::[shapeless.Nat._5,shapeless.::[shapeless.Nat._3,shapeless.HNil]]]



但是如果我用 Int(或 String,或 List 等)代替 Nat 做完全相同的事情,它就可以完美地工作。

如何映射 Nat 的 HList ?

最佳答案

问题是Poly1.Case它的类型参数不是协变的。考虑以下:

trait Foo
trait Bar extends Foo

val foo = new Foo {}
var bar = new Bar {}

object fooIdentity extends Poly1 {
implicit def caseFoo = at[Foo](identity)
}

现在 fooIdentity(foo)会编译,但是 fooIdentity(bar)惯于。

在你的情况下 HList 的成员静态类型为 _5_3 .这些是 Nat 的子类型,但是 NatToString不在乎,因为它唯一的情况是寻找静态类型为 Nat 的东西.

诀窍是在案例中添加一个类型参数:
object NatToString extends Poly1 {
implicit def caseNat[N <: Nat] = at[N](_.toString)
}

您会发现通常使用 Nat直接不是你想要的——你几乎总是想要一个特定的子类型。

关于scala - 如何映射 Nat 的无形 HList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24919783/

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