Восходящие проблемы слияния!

Другая точка состоит в том, что первое предложение анализируется как:

scala> List(1,2,3).++(List(4,5))
res0: List[Int] = List(1, 2, 3, 4, 5)

. В то время как второй пример анализируется как:

scala> List(4,5).:::(List(1,2,3))
res1: List[Int] = List(1, 2, 3, 4, 5)

Итак, если вы используете макросы, вы должны позаботиться.

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

Micro-Benchmarks после разогрева.

scala>def time(a: => Unit): Long = { val t = System.currentTimeMillis; a; System.currentTimeMillis - t}
scala>def average(a: () => Long) = (for(i<-1 to 100) yield a()).sum/100

scala>average (() => time { (List[Int]() /: (1 to 1000)) { case (l, e) => l ++ List(e) } })
res1: Long = 46
scala>average (() => time { (List[Int]() /: (1 to 1000)) { case (l, e) => l ::: List(e ) } })
res2: Long = 46

Как сказал Дэниел С. Собрай , вы можете добавить содержимое любой коллекции в список, используя ++, тогда как с ::: вы можете только конкатенировать списки.

1
задан LKANL 2 October 2010 в 01:19
поделиться