scala學習筆記(一)

2021-08-02 18:42:28 字數 1085 閱讀 9297

所有的筆記都來自於對於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...