++: не кажется правильным ассоциативным? - PullRequest
0 голосов
/ 10 марта 2019

Я пытаюсь научиться скале.Я искал документацию для очередей (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)

Как документация, так и эксперименты указывают на то, что ++: не является ассоциативным.Документация для ++ и ++: скажем, слева, затем справа, и это то, что происходит выше, я просто не понимаю, почему.Понятно, что мне чего-то не хватает.Может ли кто-нибудь уточнить это для меня?

1 Ответ

4 голосов
/ 10 марта 2019

Очень простой эксперимент:

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, который десугарсируется в q1.++:(q0), а затем расширяется до q0 ++ q1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...