2013-01-01 4 views
8

Ho lavorato per imparare i dettagli di scala, e recentemente mi sono imbattuto in qualcosa di cui sono curioso.Scala: perché non List [=> Int] funziona?

quanto ho capito, se voglio passare un blocco di codice che viene efficacemente pigramente valutata per una funzione, (senza valutare sul posto) basta digitare:

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

In questo senso, la function run riceve un blocco di codice, che deve ancora essere valutato, che valuta e restituisce l'Int calcolato di. Ho quindi cercato di estendere questa idea alla struttura dei dati dell'elenco. Digitare:

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

Ciò tuttavia restituisce un errore. Mi stavo chiedendo perché questo non è consentito. In che modo, oltre a questa sintassi, posso passare un elenco di blocchi di codice non valutati?

risposta

8

=>Int è la sintassi per i parametri del nome. =>Int non è un tipo, quindi non può essere utilizzato come parametro per List. Tuttavia, ()=>Int è un tipo. È il tipo di funzioni null che restituiscono Int. Quindi questo funziona:

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

Ah! Dovrebbe farlo, grazie per la risposta Kim. Per il verso, la JVM mette una funzione anonima, come quelle che sono memorizzate nella lista sopra, nell'heap? –

+0

Sì, sono memorizzati nell'heap. –

5
+1

Un'altra opzione è usare 'Stream', che è anche una struttura dati lazy. – folone