scala函式高階篇

2022-09-05 13:15:14 字數 1381 閱讀 4972

1、求值策略

scala裡有兩種求值策略

call by value -先對函式實參求值,在函式體中用這個求出的引數值。

call by name -先不對函式實參求值,而是函式實參每次在函式體內被用到時都會求值。

scala通常使用call by value

如果函式形參型別以 =>開頭,那麼就是在使用call by name

def foo(x : int)= x         //call by value

def foo(x : => int)= x   //call by name

def loop():int = loop //遞迴函式    //> loop: ()int

def bar(x : int,y : =>int) =1       //> bar: (x: int, y: => int)int

bar(1,loop)                                //> res3: int = 1

//bar(loop,1)                             //會死迴圈

2、高階函式

用函式作為形參或帶返回值的函式,稱為高階函式

def operate(f: (int,int) => int)=//形參傳入的是乙個函式

def greeting()= (name: string) =>//返回乙個匿名函式

3、匿名函式

匿名函式就是函式常量,也稱為函式文字量

在scala裡,匿名函式的定義格式為(形參列表)=>

4、柯理化

柯理化函式把具有多個引數的函式轉換為一條函式鏈,每個節點上是單一引數

def add(x: int,y: int)= x + y //常規函式寫法

def add(x: int)(y: int) = x + y //scala中柯理化的語法

5、遞迴函式

在函式式程式設計中是實現迴圈的一種技術。

缺陷:遞迴的層數越深,棧就越多。

6、尾遞迴函式

尾遞迴函式中所有遞迴形式的呼叫都出現在函式的末尾。

當編譯器檢測到乙個函式呼叫的是尾遞迴的時候,它就覆蓋當前的活動記錄而不是在棧中去建立乙個新的。

def factorial(n: int):int =

@annotation.tailrec

def factorial(n: int,m: int):int =

Scala函式高階篇

沒有名字的函式就是匿名函式,格式 x int x 表示輸入引數型別 int 表示輸入引數型別 函式體 表示具體 邏輯 傳遞匿名函式至簡原則 引數的型別可以省略,會根據形參進行自動的推導 型別省略之後,發現只有乙個引數,則圓括號可以省略 其他情況 沒有引數和引數超過1的永遠不能省略圓括號 匿名函式如果...

Scala高階函式

在scala中,無法直接操縱方法,只能直接操縱函式,所以需要使用 import scala math.val temp ceil val num 3.14 println fun temp num temp的型別是 double double,意為接受double引數並返回double的函式。能夠對...

Scala 高階函式

import scala.math.val num 3.14val func ceil 意味著確實指的是這個函式,而不是忘記了傳引數 func是乙個函式變數,內容儲存的是個函式 val v func num println v val arr array 1.0,3.14,4 map func 將函...