【问题标题】:Understanding `apply` and `unapply` with Singleton Type使用单例类型理解 `apply` 和 `unapply`
【发布时间】:2017-06-30 22:56:50
【问题描述】:

给定:

import shapeless._
import syntax.singleton._

case class Foo(a: String, one: Witness.`1`.T)

为什么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>

【问题讨论】:

  • 对于什么是有价值的,在 scala 2.12.2 中我得到了 (String, 1) =&gt; FooFoo =&gt; Option[(String, 1)],这可能是你所期望的。在 scala 2.11.11 中我得到 (String, 1) =&gt; FooFoo =&gt; Option[(String, Int)],最后在 scala 2.10.6 中我得到 (String, Int(1))Foo =&gt; Option[(String, Int)](就像你一样)。
  • 这似乎无关紧要,因为在 2.10.6 中这仍然有效:val a: Witness.`2`.T = Foo("a",1) match { case Foo(_,one) =&gt; one + 1; case _ =&gt; 2 }

标签: scala shapeless


【解决方案1】:

据我所知,在scala.tools.nsc.typechecker.Namers(编译器代码)中,apply使用completerOfcaseApplyMethodCompleter生成,而unapply 使用 来自 completerOf。这个和可能的其他因素,可能是一些微妙的错误,导致unapply 丢失类型信息。 This change 稍微重构了代码并导致 both 方法通过新的applyUnapplyMethodCompleter,从而修复了它。由于该问题似乎没有任何票证,因此真正的原因将需要一些额外的挖掘。假设这不是预期的行为可能是安全的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-12
    • 2021-07-15
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    相关资源
    最近更新 更多