C061.函數式編程(FP)

Function Programming

多核CPU要求開發人員必需在函數式編程方面有著堅實的基礎, 而這正式 Scala 的核心價值所在. 方法沒有副作用是函數式風格編程的重要概念, 計算並返回值應該是方法的唯一目的


高階函數(Higher-Order Functions)


在數學和電腦科學中,高階函數是至少滿足下列一個條件的函數:
  1. 接受一個或多個函數作為輸入, 或作為參數函數值
  2. 輸出一個函數, 或從函數中返回, 或在函數中嵌套
簡單的說, 就是一個帶其它函數做為參數的函數; 相對於普通函數, 無法達到上列的特性, 導致在對特定設計的函數後, 欲擴增內容成新函數時, 不得不複製前者大多數的設計再加以修改, 設計的重複性偏高與重用性偏低.

在數學中它們也叫做算子(運算符)或泛函。微積分中的導數就是常見的例子,因為它映射一個函數到另一個函數。

在無類型 lambda 演算,所有函數都是高階的;在有類型 lambda 演算(大多數函數式程式語言都從中演化而來)中,高階函數一般是那些函數型別包含多於一個箭頭的函數。在函數式編程中,返回另一個函數的高階函數被稱為 Curry 化的函數。
more ...

高階函數帶來的優點,
  1. 大幅減少重複的code
  2. 增強程序的可重用性
  3. code變的簡潔


Reference

OOP



scala> def a1(a: Int, b: Int) = println(a, b)
a1: (a: Int,b: Int)Unit

scala> def a3 = (a: Int, b: Int) => println(a + b)
a3: (Int, Int) => Unit





FP



Function
scala> val a = (a: Int, b: Int) => println(a, b)
a: (Int, Int) => Unit = <function2>

scala> var a = (a: Int, b: Int) => println(a, b)
a: (Int, Int) => Unit = <function2>



Scala Functions vs Methods

Scala has both functions and methods. Most of the time we can ignore this distinction, but sometimes we have to deal with the fact that they are not quite the same thing.