Scala中的无形状结构编程:如何正确使用SYB实现?

Scala中的无形状结构编程:如何正确使用SYB实现?,scala,generic-programming,shapeless,Scala,Generic Programming,Shapeless,我想使用中的实现编写以下通用遍历函数: class Data // Perform the desired manipulation on the given data object manipulate extends ->((data: Data) => data) def traverseAndManipulate[B](expr: B): B = { everywhere(manipulate)(expr) } 不幸的是,此代码产生以下类型错误(使用Shapele

我想使用中的实现编写以下通用遍历函数:

class Data

// Perform the desired manipulation on the given data 
object manipulate extends ->((data: Data) => data)

def traverseAndManipulate[B](expr: B): B = {
  everywhere(manipulate)(expr)
}
不幸的是,此代码产生以下类型错误(使用Shapeless 2.0.0-M1和Scala 2.10.2):

我假设类型参数
B
需要以某种方式进行约束,以使无形状库的隐式宏适用,但我不知道如何进行约束


这样的遍历函数可以使用Shapeless编写吗?

您需要在方法体中为everywhere组合器提供一个隐式见证

def traverseAndManipulate[B](expr: B)
  (implicit e: Everywhere[manipulate.type, B]) = everywhere(manipulate)(expr)
请注意,由于我目前无法理解的原因,给
traverseAndManipulate
一个显式的
B
结果类型会导致编译器报告类似的歧义。但是,结果类型正确推断为
B
。如果您更喜欢显式结果类型,则以下内容应该是等效的:

def traverseAndManipulate[B](expr: B)
  (implicit e: Everywhere[manipulate.type, B] { type Result = B }): B = e(expr)
def traverseAndManipulate[B](expr: B)
  (implicit e: Everywhere[manipulate.type, B] { type Result = B }): B = e(expr)