相关疑难解决方法(0)

在 Scala 2 或 3 中,是否可以在运行时调试隐式解析过程?

在 scala 语言中,隐式解析通常在编译时完成,有时会抛出混淆的错误信息,此类错误的一个著名例子是当 shapeless Generic 抛出错误信息时,如:

error: could not find implicit value for parameter encoder: CsvEncoder[Foo]
Run Code Online (Sandbox Code Playgroud)

(详见https://books.underscore.io/shapeless-guide/shapeless-guide.html

这个问题的一个解决方案是在运行时运行隐式解析算法(内部应该是图查询算法),这至少有两个好处:

  • 调试工具可用于逐步重现解决过程,因此即使错误信息和文档不完整,也很容易发现错误。

  • 在许多情况下,类型信息可能无法在编译时确定(例如,类型取决于控制流)。如果隐式转换不能延迟到运行时阶段,那么定义隐式转换的许多好处将无效。

所以我的问题是,Scala 2.x 或 Dotty 中是否存在此功能?还是在路线图上?

非常感谢您的意见。

scala implicit dotty scala-reflect scalameta

2
推荐指数
1
解决办法
521
查看次数

为什么Scala编译器可以提供隐式的out of object,但不能提供inside?

标题可能很模糊,但这是代码: https: //github.com/amorfis/why-no-implicit

所以有一个工具可以转化Map[String, Any]为简单的案例类。测试通过了,这段代码说明了它的全部内容:

        case class TargetData(
          groupId: String,
          validForAnalysis: Boolean,
          applicationId: Int
        )

        val map = Map(
          "groupId" -> "123456712345",
          "applicationId" -> 31,
          "validForAnalysis" -> true
        )

        val transformed: TargetData = MapDecoder.to[TargetData](map).transform
Run Code Online (Sandbox Code Playgroud)

这段代码有效。当提供简单的情况时,它很好地创建了案例类实例map

但是,该transform方法必须在“外部”调用 - 就像示例中一样。当我尝试将其移至该MapDecoder.to方法时 - 编译器抱怨缺少隐式。

所以我将代码更改MapDecoder.to为:

def to[A](map: Map[String, Any]) = new MapDecoderH[A](map)
Run Code Online (Sandbox Code Playgroud)

对此:

def to[A](map: Map[String, Any]) = new MapDecoderH[A](map).transform
Run Code Online (Sandbox Code Playgroud)

它停止工作了。这是为什么?为什么在一种情况下提供了隐含的内容,而在另一种情况下则没有提供?所有的变化是我想transform在其他地方调用该方法以MapDecoder.to返回案例类而不是某个转换器。

更新:

to[A]如果我想在要转换的对象内实现方法怎么办?让我们称之为DataFrame,我希望这段代码能够工作:

val df: DataFrame = ... …
Run Code Online (Sandbox Code Playgroud)

scala implicit shapeless

1
推荐指数
1
解决办法
137
查看次数

标签 统计

implicit ×2

scala ×2

dotty ×1

scala-reflect ×1

scalameta ×1

shapeless ×1