隐式参数:如何在函数签名中编码?

Implicit arguments: how to encode in function signature?

继@TravisBrown 关于使用 shapeless 枚举 ADT 的精彩启发 question 之后,我得到以下代码片段:

implicitly[EnumerableAdt[Foo]].values

我想将它封装在一个方法中,这样我就不必在每次调用后都.values(这样对我来说似乎更干净API)。 但是我好像不太对劲。每当我尝试封装 implicitly[EnumerableAdt[Foo]] 时,我都会收到隐式解析错误。

我尝试过的对我来说最有意义的是,例如:

def imply[T](implicit ev: T):Set[T] = implicitly[EnumerableAdt[T]].values

当然没有 ev 对我来说更没有意义。

我不是类型级编程方面的专家。

如果您查看 implicitly[X] 的定义,您会发现它需要范围内类型为 X 的隐式参数。在您的示例中,您在范围内隐含了 ev: T,这不足以调用 implicitly[EnumerableAdt[T]]!请尝试以下定义:

def imply[T](implicit ev: EnumerableAdt[T]):Set[T] = ev.values