1. 程式人生 > >在Scala中使用函數語言程式設計(函式和高階函式)

在Scala中使用函數語言程式設計(函式和高階函式)

                                       

    圖示,這是一個普通函式的定義(在java裡面通常稱為方法),函式可以定義在object單例物件中

 1 object MyModule {         //宣告一個單例物件  —>  即同時宣告一個類和它的唯一例項
 2   def abs(n: Int): Int =    //abs方法接收一個integer並返回一個integer
3 if (n < 0) -n //如果n小於0,返回-n 4 else n //否則返回n 5 6 private def formatAbs(x: Int) = { //一個私有方法只能被MyModule裡的其他成員呼叫 7 val msg = "The absolute value of %d is %d" //字串裡有2個佔位符,%d代表數字 8 msg.format(x,abs(x)) //在字串裡將2個%d佔位符分別替換為x和abs(x) 9 } 10 11
def main(args: Array[String]): Unit = { //Unit類似於Java或C語言裡的void 12 println(formatAbs(-42)) 13 } 14 }

    

    一些基礎概念:

            通過def去定義一個函式,等號“=”左邊的宣告部分我們稱為“函式簽名”,右邊則為“定義”

            val定義的變數的是一個值相當於java中的final,不可變

            Unit相當於型別空,當一個函式的返回值為空時,字面上會返回 "()"

            通常返回Unit型別的函式,暗示它包含副作用

 

    模組、物件和名稱空間:

            Scala總每個值都可以當成一個物件,每個物件都有零個或多個成員

    物件的主要目的是給成員一個名稱空間,也稱模組

            區別於JAVA,Int在Scala中也被視為物件 --->

    1+2 可以看成1.+(2)的語法糖(只有物件才可以通過"."來呼叫成員)

 

    高階函式:

            把一個函式當作引數傳遞給另一個函式被稱為高階函式

            函式是一等公民,函式也是值

            注:對於高階函式的引數,我們通過以f、g來命名是一種習慣做法。在

    函數語言程式設計中,我們更傾向於使用短的變數名,甚至單個字母命名。因為高階函式通常沒

    法表示引數到底執行什麼,無法體現它們的含義(變數名的約定)

 

    預設引數:

 

 1 object HelloWorld {
 2   def main(args: Array[String]): Unit = {
 3     default()         //預設引數:呼叫時沒有手動傳參,函式引數列表預設使用初始值
 4     default("You")
 5   }
 6 
 7   def default(name: String = "My"): Unit = { //這裡給予引數列表一個初始值
 8     println("hello "+name)
 9   }
10 }