隐式参数:如何在函数签名中编码?
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
继@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