++:似乎不是正确的结合?
++: does not appear to be right associative?
我正在努力学习 Scala。我正在查看队列的文档 (https://www.scala-lang.org/api/current/scala/collection/immutable/Queue.html)。
据我了解,以冒号结尾的方法是右结合的。但是,对我来说,++: 似乎不会这样做:
import scala.collection.immutable.Queue
val q0 = Queue(0)
val q1 = Queue(1)
q0 ++ q1 // yields Queue(0,1) as I expected
q0 ++: q1 // yields Queue(0,1) as well; I expected Queue(1,0)
文档和实验似乎都表明 ++: 不是右结合的。 ++ 和 ++ 的文档:先左后右,这就是上面发生的事情,我只是不明白为什么。显然,我缺少一些东西。有人可以为我澄清一下吗?
一个非常简单的实验:
case class A(s: String) { def ++:(a: A) = A(s"(${a.s} + ${s})") }
A("x") ++: A("y") ++: A("z")
给出:
A((x + (y + z)))
所以它是 x + (y + z)
而不是 (x + y) + z
。因此,++:
是右结合的,正如所宣传的那样。
请注意,它是 ${a.s} + ${s}
而不是 ${s} + ${a.s}
。在 Queue
的情况下,它可能是类似的,类似于:
def ++:(left: Queue[A]): Queue[A] = left ++ this
所以当你写 q0 ++: q1
时,元素的顺序出现 "as it should be",它会脱糖成 q1.++:(q0)
,然后扩展成 q0 ++ q1
。
我正在努力学习 Scala。我正在查看队列的文档 (https://www.scala-lang.org/api/current/scala/collection/immutable/Queue.html)。
据我了解,以冒号结尾的方法是右结合的。但是,对我来说,++: 似乎不会这样做:
import scala.collection.immutable.Queue
val q0 = Queue(0)
val q1 = Queue(1)
q0 ++ q1 // yields Queue(0,1) as I expected
q0 ++: q1 // yields Queue(0,1) as well; I expected Queue(1,0)
文档和实验似乎都表明 ++: 不是右结合的。 ++ 和 ++ 的文档:先左后右,这就是上面发生的事情,我只是不明白为什么。显然,我缺少一些东西。有人可以为我澄清一下吗?
一个非常简单的实验:
case class A(s: String) { def ++:(a: A) = A(s"(${a.s} + ${s})") }
A("x") ++: A("y") ++: A("z")
给出:
A((x + (y + z)))
所以它是 x + (y + z)
而不是 (x + y) + z
。因此,++:
是右结合的,正如所宣传的那样。
请注意,它是 ${a.s} + ${s}
而不是 ${s} + ${a.s}
。在 Queue
的情况下,它可能是类似的,类似于:
def ++:(left: Queue[A]): Queue[A] = left ++ this
所以当你写 q0 ++: q1
时,元素的顺序出现 "as it should be",它会脱糖成 q1.++:(q0)
,然后扩展成 q0 ++ q1
。