gpt4 book ai didi

scala - 使用 Shapeless : How to use the SYB implementation correctly? 在 Scala 中进行结构化编程

转载 作者:行者123 更新时间:2023-12-04 04:36:08 26 4
gpt4 key购买 nike

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

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):

type mismatch;
[error] found : shapeless.EverywhereAux[SYB.manipulate.type]
[error] required: ?{def apply(x$1: ? >: B): ?}
[error] Note that implicit conversions are not applicable because they are ambiguous:
[error] both method inst1 in trait PolyInst of type [A](fn: shapeless.Poly)(implicit cse: fn.ProductCase[shapeless.::[A,shapeless.HNil]])A => cse.Result
[error] and macro method apply in object Poly of type (f: Any)shapeless.Poly
[error] are possible conversion functions from shapeless.EverywhereAux[SYB.manipulate.type] to ?{def apply(x$1: ? >: B): ?}
[error] everywhere(manipulate)(expr)

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

这样的遍历函数可以用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)

关于scala - 使用 Shapeless : How to use the SYB implementation correctly? 在 Scala 中进行结构化编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19726824/

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