2013-01-01 20 views
8

Pracuję nad poznawaniem scala, a ostatnio natknąłem się na coś, co mnie interesuje.Scala: dlaczego nie działa lista [=> Int]?

Jak rozumiem, jeśli chcę przekazać blok kodu, który jest skutecznie leniwie ocenianego do funkcji (bez oceniania go na miejscu) mogłem wpisać:

def run(a: =>Int):Int = {...} 

W tym sensie, funkcja run otrzymuje blok kodu, który jest jeszcze oceniany, który ocenia i zwraca obliczone Int. Następnie próbowałem rozszerzyć ten pomysł na strukturę danych List. Wpisanie:

def run(a: List[=>Int]) = {...} 

To jednak zwraca błąd. Zastanawiałem się, dlaczego jest to niedozwolone. Jak, poza tą składnią, mogę podać listę nieocenionych bloków kodu?

Odpowiedz

8

=>Int to składnia parametrów według nazwy. =>Int nie jest typem, więc nie może być używany jako parametr do List. Jednak ()=>Int jest typem. Jest to typ funkcji nullary, które zwracają Int. Tak więc to działa:

def run(a: List[()=>Int]) = {...} 
+0

Ah! To powinno wystarczyć, dziękuję za odpowiedź Kim. Czy według JVM anonimowa funkcja, taka jak te przechowywane na powyższej liście, znajduje się w stercie? –

+0

Tak, są one przechowywane na stercie. –

5
+1

Inną opcją jest użycie 'Stream', który jest również leniwą strukturą danych. – folone