所有的筆記都來自於對於coursea上洛桑聯邦理工學院的scala 函式式程式設計原理課程的理解和摘錄。
scala中兩種求值策略, call-by-value(cbv,應用序求值)和call-by-name(cbn,正則序求值)。
如果化簡表示式由單純的表示式構成,並且它們都會終止,不陷入迴圈,那麼兩種求值策略的結果是相同的,但是它們各有優勢。
cbv優勢在於函式的每個引數只會被求值一次。
cbn優勢在於如果函式引數在函式體中沒有被呼叫,那麼就不需要計算它。
舉個例子:
def test(x: int, y:int) = x*x
test(2,3)
test(3+4,8)
test(7,2*4)
test(3+4,2*4)
這下cbn和cbv的區別就清楚了,對於cbn函式的所有引數都要求完值之後再代入函式進行運算,而cbv是直接將表示式代入函式。接下來我們再來看乙個不終止的例子來進一步加深對它們的理解:
def first(x: int, y:int) = x
def loop: int = loop
first(1,loop)
對於cbn,執行first(1,loop),我們將得到值1。
對於cbv,執行first(1,loop),我們將陷入迴圈,無法終止,因為cbv一定要求出loop的值才行。
scala中我們一般運用cbv,因為在實際的運算中,cbv往往會非常高效相較於cbn,因為它避免了大量的重複運算。如果我們有時候需要採用cbn,我們該如何操作呢。給出如下示例:
def constone(x: int, y: => int) = 1
這樣的話,對於引數x,我們採用cbv,而引數y,我們採用cbn。
同時在定義的時候,也有「by-name」和「by-value」的差別
def loop:boolean = loop
def x = loop
val x = loop
def的話沒關係,而val的話將陷入迴圈,無法終止,因為val在定義的時候就要算出值來。 Scala學習筆記
scala學習筆記 一.scala中集合的常用方法 首先定義兩個陣列集合,用於測試 scala val arr1 array 1,2,3,4 arr1 array int array 1,2,3,4 scala val arr2 array 3,4,5,6 arr2 array int array ...
Scala學習筆記
1 閉包 var a 3 var addfun x int x a var b addfun 10 println b addfun 就是個和物件無關的函式,區域性變數,使用方法和函式一樣,但是好像不推薦這種寫法。2 類的建立,簡單使用abstract class bparent 構造函式引數會自動...
Scala 學習筆記
object a val u fab 15,list 1,1 val f p int print p t 變長引數 def sum nums int int int def main args array string unit def f p int int print f 4 object ab...