用Singleton Type理解`apply`和`unapply`

Kev*_*ith 8 scala shapeless

鉴于:

import shapeless._
import syntax.singleton._

case class Foo(a: String, one: Witness.`1`.T)
Run Code Online (Sandbox Code Playgroud)

为什么Foo.apply _Foo.unapply _有不同的特征,即Int(1)Int分别是多少?

scala> Foo.apply _
res5: (String, Int(1)) => Foo = <function2>

scala> Foo.unapply _
res6: Foo => Option[(String, Int)] = <function1>
Run Code Online (Sandbox Code Playgroud)

HTN*_*TNW 6

据我所知,在scala.tools.nsc.typechecker.Namers(编译代码),apply 用于通过生成completerOf caseApplyMethodCompleter,而unapply 来自公正completerOf.这个以及可能的其他因素,可能是一些微妙的错误,导致unapply丢失类型信息.这个更改会对代码进行一些重构,并导致两个方法都通过new applyUnapplyMethodCompleter来修复它.由于在这个问题上似乎没有任何票证,真正的原因将需要一些额外的挖掘.假设这不是预期的行为,可能是安全的.