2016-03-20 15 views
1

replNeden iskele operatörünü scala'ya geri kullanıyorsunuz? scala olarak

scala> List(1) :: 2 
<console>:8: error: value :: is not a member of Int 
      List(1) :: 2 

ama

scala> 2 :: List(1); 
res4: List[Int] = List(2, 1) 

infix operatörleri soldan sağa okumak durumunda, yukarıdaki satır

List(1) :: 2 
List(1).::(2) 

ve

çevirmek için bu durum karşı sezgisel
2 :: List(1) 
2.::(List(1)) 

Bir Int'un List yaptığı bir yöntem yok :: yöntemi yoktur. Yanlış bir şey mi var?

+1

Olası yinelenen:

pahalı olsa da, yine de önce sol taraf olduğunu :+ operatörü kullanarak yapabilirsiniz // stackoverflow.com/questions/1162924/what-good-are-right-associative-methods-in-scala) –

cevap

3

Bu konuda, mantıksal olarak, çok daha mantıklı düşünürsek infix operatörleri okunur eğer sağ

soldan beri karşı sezgisel.(cons) operatörü (0) değerini listenin başına gönderir, değerini ekleyerek listenin sonuna ekler. Böyle düşünmek zaman, :: operatör doğru ilişkisel olması bunun List başlangıcına unsurunu taşıyorsa olarak, mantıklı:

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

iç uygulama oldukça basittir:

def ::[B >: A] (x: B): List[B] = 
    new scala.collection.immutable.::(x, this) 

List dahili olarak, koleksiyondaki ilk öğe olan bir baş ve kuyruk olan kalan öğelerin bir listesini içeren bir BağlantılıListedir. Bu nedenle, elemanın öncelenmesi, elemanların kopyalanması ve yeni değerin eklenmesi amacıyla iç listenin bir O (n) geçişini gerektireceğinden, bu ürünün eklenmesinden daha ucuzdur. [? Scala sağ ilişkisel yöntemler nelerdir iyi] (http

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

: ile biten ölçek operatörleri doğru ilişkilendirilebilir. Bu nedenle, örneğinizde, :: operatörünü Int'a uyguladığınızdan. Ayrıca, List yapıları Scala'da değişmezdir, bu nedenle listenin sonuna eklenmek oldukça pahalıdır; Bir listenin başına bir değer girilmesi çok ucuzdur.