17 lutego 2013

Listy w Scali

Nie, nie chodzi mi o pisanie listów, a ich używanie. I nie chodzi mi również o tradycyjne listy w kopercie, a tradycyjne listy jako struktury danych w Scali. Są one wszechobecne w Clojure i mają w tym języku specjalne traktowanie, co okazuje się być w sprzeczności do Scali, w której "lists now integrate more closely into the collections framework, and are less of a special case than before."

Początkowo sądziłem, że istnieje literał dla utworzenia listy, ale najwyraźniej się myliłem, bo…
scala> ()

scala> val a = ()
a: Unit = ()
...jest to oznaczenie dla typu scala.Unit, w którym "There is only one value of type Unit, (), and it is not represented by any object in the underlying runtime system. A method with return type Unit is analogous to a Java method which is declared void."

Myślałem sobie, że może () ma specjalne traktowanie w Scali, podobnie jak w Clojure, dla którego oznacza pustą listę. Spróbowałem więc…
scala> (1, 2, 3)
res1: (Int, Int, Int) = (1,2,3)

scala> res1.getClass
res2: Class[_ <: (Int, Int, Int)] = class scala.Tuple3
...co okazało się być tym razem jeszcze innym typem scala.Tuple3, a nie oczekiwaną listą. Cóż pozostaje przyzwyczaić się do zapisu...
scala> List(1, 2, 3)
res3: List[Int] = List(1, 2, 3)
lub
scala> 1 :: 2 :: 3 :: Nil
res4: List[Int] = List(1, 2, 3)
...i poczytać dokumentację dla scala.collection.immutable.List. Zacznę od Lists w Scala Documentation.

Nie za krótki wpis? Nie za trywialny? Kontynuować wspólne poznawanie Scali w serii takich wpisów czy może uzupełnić to i owo? Sugestie mile widziane.