了解FP(Function Programming)
在看javascript的Closure觀念 -> λ-calculus -> FP
就這樣子看到FP
更新記錄
item | note |
---|---|
20160817 | 第一版 |
目錄
Function Programming
什麼是 Functional Programming">什麼是 Functional Programming
以前是處理數學函數計算,又以 λ演算 (λ calculus) 為基礎
那到底什麼又是 Functional Programming (FP)呢
只需要給我處理後的結果,不需要過問結果如何而來
Functional programming is programming without assignment statements.
來源: functional-programming-basics
一般java寫法
1
2
3
4
5
6public class Squint {
public static void main(String args[]) {
for (int i=1; i<=25; i++)
System.out.println(i*i);
}
}改成FP方式
There are three words in that program: take, squares-of, and integers. Each of those words refers to a function.1
(take 25 (squares-of (integers)))
函数式语言之所以被如此称呼,是因为程序完全是由函数组成的。主程序本身也是一个函数,以程序的输入为参数,并返回其输出
Functional programming wiki">Functional programming wiki
In computer science, functional programming is a programming paradigm
- a style of building the structure and elements of computer programs
- that treats computation as the evaluation of mathematical functions and avoids changing-state and mutable data.
- 避免使用程序状态以及易变物件
- 函數程式語言最重要的基礎是λ演算(lambda calculus)
- 雖然λ演算並非設計來於計算機上執行,但它可以被視作第一個函數式編程語言
- LISP 是第一個函數式語言,越來越多函數式語言隨之出現。真實世界的函數式語言無法像 Lambda Calculus 那樣
F# 程式設計入門 ">F# 程式設計入門
- 函數式編程語言的效率確實比命令式(imperative)編程語言來得差
- 後又開始重視「簡單」、「快速開發」。想要「簡單」、「快速開發」,就要用比較高階的抽象,因此函數式編程比命令式編程更適合現在的開發環境
- lambda calculus 的函數可以接受函數當作輸入(引數)和輸出(傳出值)
- 1958 年,對 lambda calculus 相當感興趣的 MIT 教授 John McCarthy 設計出 Lisp 語言,Lisp 實踐了 lambda calculus
FP 的特點
- 沒有副作用(Side Effect)。在表示式(expression)內不可以造成值的改變
- 第一級函數(First-Class Function)。函數被當作一般值對待,而不是次級公民,也就是說,函數可當作「傳入參數」或「傳出結果」
mperative Programming 認為程式的執行,就是一連串狀態的改變
但 FP 將程式的運作,視為數學函數的計算,且避免「狀態」和「可變資料」
Functional Programming 教我的事">Functional Programming 教我的事
- 多核時代,需要能Concurrency的程式
- 用程序性的OO語言寫Concurrency很難
- Function Programing讓Concurrency Programming變簡單
- FP特色
- Avoiding Mutable State
- Recursion
- Higher-Order Functions
把function做參數傳遞到function裡
function可以當做function回傳的結果 - Function Composition
- Lazy Evaluation
需要才執行 - Pattern Matching