那些函數語言Tutorial  沒有教我的事  大貓 (@miaout17)    OSDC 2013
About me• 大貓, YC Ling, @miaout17  – 感冒中,聲音有點啞請見諒 m(_ _)m• Game developer, 2007~2010• Web (backend) developer, 2010~now• ht...
Why I started to learn FP?       (2007年)聽說,函數語言適合寫平行、並行的程式
The Next Mainstream Programming Language:   A Game Developer’s Perspective (2006)      Tim Sweeney, CEO of Epic Games
說好的困境呢?
Really? First result of Google “functional programming concurrent”…http://www.quora.com/Why-does-functional-programming-fa...
Outline•   函數語言的各種特性•   Pure Function & Side Effect•   Immutable Data Structure•   Conclusion
關於範例程式碼• 以下投影片中,會使用C++, Java, Scala,  Haskell, Erlang做為範例• 不需要讀懂所有程式碼,只要理解我介紹  的語言特性即可
函數語言的各種特性                      Higher-Order        Function         Partial                        Function         Compos...
Side Effect• 函數語言沒有副作用?• 函數語言中的函數都是純函數?• 什麼是純函數? – 沒有副作用 – 給與相同參數,得到相同結果
所有程式都有Side-Effect• 修改記憶體狀態• 在螢幕上顯示資訊• 將結果輸出至檔案重點不是「避免副作用」,而是區分「有副作用」及「沒有副作用」的function
Pure Function - C++C++: Impure Function     C++: Pure Function          Output:          1          2          6          ...
Pure Function – Erlang  Single Assignment                                      Impure             print_factorical(5, 1, 1...
Pure Function – HaskellSingle Assignment & IO Monad                               Pure                          Shorter
Side Effect & Pure Function – 小結• 函數語言沒有副作用? – 命題沒有意義。所有程式都有副作用。• 函數語言中,所有函數都是純函數? – 大多數的函數語言無法保證函數是純函數。(Ex. Lisp, Scheme,...
Immutable Data Structure• 函數語言中,資料都是不可變(Immutable)的?• 使用函數語言,就不必擔心平行程式中,共享  可變狀態的問題了?
Immutable Data Structure – Java, Scala             Java                  Scala
Immutable Data Structure - Haskell
Immutable Data Structure – 小結• 函數語言中,資料都是不可變(Immutable)的? – 只有Haskell, Erlang等少數語言保證資料結構不可變。• 如何確保資料結構不可變? – 語言保證所有資料結構皆不可...
Conclusion• 現今「函數語言」其實是指很多具有不同特性  的語言,很難一言概括分析。• 分析語言帶來的好處,應該逐一分析 – 語言特性帶來的優點(及其代價) – 編程典範帶來的優點• 函數語言不是並行、平行程式的萬靈丹,但其  編程典...
Future Reading• Actor Model• Software Transactional Memory• Persistence Data Structure
Thanks for your participation       Any question?
Upcoming SlideShare
Loading in …5
×

那些函數語言Tutorial沒有教我的事

6,244 views

Published on

那些函數語言Tutorial沒有教我的事

  1. 1. 那些函數語言Tutorial 沒有教我的事 大貓 (@miaout17) OSDC 2013
  2. 2. About me• 大貓, YC Ling, @miaout17 – 感冒中,聲音有點啞請見諒 m(_ _)m• Game developer, 2007~2010• Web (backend) developer, 2010~now• http://about.me/miaout17
  3. 3. Why I started to learn FP? (2007年)聽說,函數語言適合寫平行、並行的程式
  4. 4. The Next Mainstream Programming Language: A Game Developer’s Perspective (2006) Tim Sweeney, CEO of Epic Games
  5. 5. 說好的困境呢?
  6. 6. Really? First result of Google “functional programming concurrent”…http://www.quora.com/Why-does-functional-programming-favor-concurrency No Side Effect FunctionalMulti-Core Concurrency Programming Immutable Data
  7. 7. Outline• 函數語言的各種特性• Pure Function & Side Effect• Immutable Data Structure• Conclusion
  8. 8. 關於範例程式碼• 以下投影片中,會使用C++, Java, Scala, Haskell, Erlang做為範例• 不需要讀懂所有程式碼,只要理解我介紹 的語言特性即可
  9. 9. 函數語言的各種特性 Higher-Order Function Partial Function Composition Application Lisp, Scheme Erlang, Haskell, Clojure, Scala First-Class Perl, Ruby, Python, JavaScript Function C++11, C#3.0, Java8… Functional Immutable Programming Data Structure Monad Haskell, Erlang…Haskell… Single Category Pure Assignment Functional Haskell… Arrow No Side Effect
  10. 10. Side Effect• 函數語言沒有副作用?• 函數語言中的函數都是純函數?• 什麼是純函數? – 沒有副作用 – 給與相同參數,得到相同結果
  11. 11. 所有程式都有Side-Effect• 修改記憶體狀態• 在螢幕上顯示資訊• 將結果輸出至檔案重點不是「避免副作用」,而是區分「有副作用」及「沒有副作用」的function
  12. 12. Pure Function - C++C++: Impure Function C++: Pure Function Output: 1 2 6 24 120…
  13. 13. Pure Function – Erlang Single Assignment Impure print_factorical(5, 1, 1) 1 print_factorical(5, 2, 1) 2 print_factorical(5, 3, 2) 6 print_factorical(5, 4, 6) 24 print_factorical(5, 5, 24) 120 Pure gen(5, 1, 1, []) =gen(5, 2, 1, [1]) =gen(5, 3, 2, [2, 1]) =gen(5, 4, 6, [6, 2, 1]) =gen(5, 5, 24, [24, 6, 2, 1]) =[120, 24, 6, 2, 1]
  14. 14. Pure Function – HaskellSingle Assignment & IO Monad Pure Shorter
  15. 15. Side Effect & Pure Function – 小結• 函數語言沒有副作用? – 命題沒有意義。所有程式都有副作用。• 函數語言中,所有函數都是純函數? – 大多數的函數語言無法保證函數是純函數。(Ex. Lisp, Scheme, Scala…) – 少數語言有單一賦值特性,可避免廣域變數造成副作用。 (Ex. Haskell, Erlang…) – 少數語言可用型別系統區別純函數與非純函數。(Ex. Haskell…)• 使用函數語言就不用擔心副作用的問題了(X)• 學習函數語言的編程典範,能對純函數、副作用 等概念有更透徹的理解 (O)
  16. 16. Immutable Data Structure• 函數語言中,資料都是不可變(Immutable)的?• 使用函數語言,就不必擔心平行程式中,共享 可變狀態的問題了?
  17. 17. Immutable Data Structure – Java, Scala Java Scala
  18. 18. Immutable Data Structure - Haskell
  19. 19. Immutable Data Structure – 小結• 函數語言中,資料都是不可變(Immutable)的? – 只有Haskell, Erlang等少數語言保證資料結構不可變。• 如何確保資料結構不可變? – 語言保證所有資料結構皆不可變 (Ex. Haskell, Erlang) – 將特定資料結構宣告為不可變 (Ex. Scala, Java, C++…) – 約定與紀律• 使用函數語言,就不必擔心平行程式中,共享可 變狀態的問題了 (X)• 學習函數語言的編程典範,能對純函數、不可變 資料等概念有更透徹的理解 (O)
  20. 20. Conclusion• 現今「函數語言」其實是指很多具有不同特性 的語言,很難一言概括分析。• 分析語言帶來的好處,應該逐一分析 – 語言特性帶來的優點(及其代價) – 編程典範帶來的優點• 函數語言不是並行、平行程式的萬靈丹,但其 編程典範相當適合並行、平行程式。• 不要輕易相信或否定他人的說法 – 試著獨立思考、驗證這些說法
  21. 21. Future Reading• Actor Model• Software Transactional Memory• Persistence Data Structure
  22. 22. Thanks for your participation Any question?

×