函數式程式設計? • Joel Spolsky 具備一級函式的程式語言,能讓你找到更多抽象 化的機會 - 《約耳續談軟體》 • Simon Peyton Jones – 純函數式領域中學到的觀點和想法,可能會給 主流領域帶來資訊、帶來啟發 - 《編程的頂尖 對話》
9.
函數式程式設計? • I Haveto Be Good at Writing Concurrent Programs • Most Programs Are Just Data Management Problems • Functional Programming Is More Modular • I Have to Work Faster and Faster • Functional Programming Is a Return to Simplicity
• 費式數的數學定義 F0 = 0 F1 = 1 Fn = Fn-1 + Fn-2 • 指令式程設(Imperative programming) int fib(int n) { int a = 1; int b = 1; for(int i = 2; i < n; i++) { int tmp = b; b = a + b; a = tmp; } return b; }
初探函數程式設計 • 將問題分解為子問題才是重點 –遞迴只是程式語法上表現子問題外在形式 • 命令式加總數列 – 變數 sum 初始值為 0,逐一取得數列元素與 sum 相加後更新 sum,直到沒有下個元素後傳 回 sum …(命令電腦如何求解) int sum(int[] nums) { int sum = 0; for(int num : nums) { sum += num; } return sum; }
• 傳回 null時 … String name = selectBy(id); if(name == null) { name = "guest"; } • 設計 getOrElse 方法 String getOrElse(String original, String replacement) { return original == null ? replacement : original; } String name = getOrElse(selectBy(id), "Guest")
47.
• 設計 Option物件 public class Option<T> { private final T value; public Option(T value) { this.value = value; } public T getOrElse(T replacement) { return this.value == null ? replacement : this.value; } } Option<T> selectBy(T replace) { ... return new Option(rs.next() ? rs.getString("name") : null); } String name = selectBy(id).getOrElse("Guest")
48.
函數式程式設計? • I Haveto Be Good at Writing Concurrent Programs • Most Programs Are Just Data Management Problems • Functional Programming Is More Modular • I Have to Work Faster and Faster • Functional Programming Is a Return to Simplicity