考虑扩张的过程
Meta[Message1]
:
-
膨胀时
元[消息1 ]
具有
message
编译器需要
Meta[Field3 :: Group1 :: HNil]
-
稍后,当扩展时
Meta[Group1]
具有
group
它需要
Meta[Field1 :: Field2 :: HNil]
编译器发现,在这个分支中,它已经扩展了类型构造函数
::
至少具有相同的复杂性(即,在
HList
)所以它假设,这个扩展分支产生一个无限循环,并报告隐式散度。
为了防止这种行为,你可以使用
shapeless.Lazy
. 从文档中:
包装延迟计算的值。在隐式过程中也绕过了循环
如下图所示,搜索或错误的隐含分歧,并保持
相应的隐式值延迟。
为了解决这个问题,你可以总结一下
Lazy
扩大
Head
在里面
hcons
:
implicit def hcons[Head, Tail <: HList](implicit
h: Lazy[Meta[Head]],
t: Meta[Tail]
): Meta[Head :: Tail] =
new Meta[Head :: Tail] {}
通常你应该包起来
懒惰
头部的扩张
HLIST
和
Coproduct
规则,以及扩展
Repr
在里面
Generic
规则。我想,在这里不需要后者,因为你必须通过
HCONS
规则,已经有了
懒惰
,从一个
Group
或
Message
对另一个)。