2013-01-01 104 views
8

我一直在努力學習scala的細節,最近我遇到了一些我很好奇的東西。Scala:爲什麼List [=> Int]不工作?

據我所知,如果我想傳遞一個有效懶惰地評估,以一個函數的代碼塊,(不當場評估它)我可以輸入:

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

在這個意義上,該函數運行接收一個代碼塊,該代碼塊尚未被評估,它將評估並返回計算出的Int。然後我試圖將這個想法擴展到List數據結構。打字:

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

但是,這會返回錯誤。我想知道爲什麼這是不允許的。除了這個語法之外,我可以傳遞一個未評估的代碼塊列表嗎?

回答

8

=>Int是按名稱參數的語法。 =>Int不是一種類型,因此它不能用作List的參數。但是,()=>Int是一種類型。這是無效函數的類型返回Int。所以這個工作原理:

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

啊!這應該這樣做,感謝金的回答。由此,JVM是否將一個匿名函數(如上面列表中存儲的函數)放在堆中? –

+0

是的,它們存儲在堆中。 –

5
+1

另一種選擇是使用'Stream',這也是一個懶惰的數據結構。 – folone

相關問題