Jos*_*cus 4 scala implicit typeclass shapeless
当Scala的调用implicitly在运行时返回null时,我最近感到很惊讶.我认为这是不可能的,因为如果在隐式范围内没有可用的隐式实例,代码就不应该编译.何时隐式允许返回null?这是编译器限制,还是这种预期的行为?
如果有帮助,这里有一些背景信息.我正在使用无形来派生类型类实例来持久化任意嵌套的case类.我认为在嵌套的case类中隐式使用来检查是否可以派生类型类实例是有帮助的,因为可能不清楚从哪里开始查看嵌套的case类是否很大.
所以,例如,如果我试图坚持:
case class Foo(bar: Bar, baz: Baz)
Run Code Online (Sandbox Code Playgroud)
并且编译器无法为我的格式化程序派生一个实例MyFormatter[Foo],我开始做类似以下的事情:
case class Bar(i: Int, q: Qux)
object Bar {
implicit val formatter = implicitly[MyFormatter[Bar]]
}
Run Code Online (Sandbox Code Playgroud)
期望编译器告诉我它找不到隐式实例MyFormatter[Bar].
相反,这是一个可怕的想法,我的代码编译(当它不应该,因为没有Qux的类型类实例可以派生)并且Bar.formatter在运行时为null.
您的隐式定义是递归的.
scala> class C ; object C { implicit val cs: List[C] = implicitly[List[C]] }
defined class C
defined object C
scala> C.cs
res0: List[C] = null
Run Code Online (Sandbox Code Playgroud)
cs不仅在范围内,而且对象C在List [C]的隐式范围内.
此外,最好指定含义类型; 有时需要推断工作; 有一天它将是必需的.
| 归档时间: |
|
| 查看次数: |
276 次 |
| 最近记录: |