SlideShare a Scribd company logo
1 of 22
那些函數語言Tutorial
  沒有教我的事
  大貓 (@miaout17)
    OSDC 2013
About me
• 大貓, YC Ling, @miaout17
  – 感冒中,聲音有點啞請見諒 m(_ _)m
• Game developer, 2007~2010
• Web (backend) developer, 2010~now
• http://about.me/miaout17
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-favor-concurrency

                                             No Side
                                              Effect
                    Functional
Multi-Core                                                      Concurrency
                   Programming
                                           Immutable
                                             Data
Outline
•   函數語言的各種特性
•   Pure Function & Side Effect
•   Immutable Data Structure
•   Conclusion
關於範例程式碼
• 以下投影片中,會使用C++, Java, Scala,
  Haskell, Erlang做為範例
• 不需要讀懂所有程式碼,只要理解我介紹
  的語言特性即可
函數語言的各種特性
                      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
Side Effect
• 函數語言沒有副作用?
• 函數語言中的函數都是純函數?

• 什麼是純函數?
 – 沒有副作用
 – 給與相同參數,得到相同結果
所有程式都有Side-Effect
• 修改記憶體狀態
• 在螢幕上顯示資訊
• 將結果輸出至檔案

重點不是「避免副作用」,而是區分「有副
作用」及「沒有副作用」的function
Pure Function - C++
C++: Impure Function     C++: Pure Function




          Output:
          1
          2
          6
          24
          120…
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]
Pure Function – Haskell
Single Assignment & IO Monad
                               Pure




                          Shorter
Side Effect & Pure Function – 小結
• 函數語言沒有副作用?
 – 命題沒有意義。所有程式都有副作用。
• 函數語言中,所有函數都是純函數?
 – 大多數的函數語言無法保證函數是純函數。(Ex. Lisp, Scheme, Scala…)
 – 少數語言有單一賦值特性,可避免廣域變數造成副作用。
   (Ex. Haskell, Erlang…)
 – 少數語言可用型別系統區別純函數與非純函數。(Ex. Haskell…)

• 使用函數語言就不用擔心副作用的問題了(X)
• 學習函數語言的編程典範,能對純函數、副作用
  等概念有更透徹的理解 (O)
Immutable Data Structure
• 函數語言中,資料都是不可變(Immutable)的?
• 使用函數語言,就不必擔心平行程式中,共享
  可變狀態的問題了?
Immutable Data Structure – Java, Scala
             Java                  Scala
Immutable Data Structure - Haskell
Immutable Data Structure – 小結
• 函數語言中,資料都是不可變(Immutable)的?
 – 只有Haskell, Erlang等少數語言保證資料結構不可變。
• 如何確保資料結構不可變?
 – 語言保證所有資料結構皆不可變 (Ex. Haskell, Erlang)
 – 將特定資料結構宣告為不可變 (Ex. Scala, Java, C++…)
 – 約定與紀律
• 使用函數語言,就不必擔心平行程式中,共享可
  變狀態的問題了 (X)
• 學習函數語言的編程典範,能對純函數、不可變
  資料等概念有更透徹的理解 (O)
Conclusion
• 現今「函數語言」其實是指很多具有不同特性
  的語言,很難一言概括分析。
• 分析語言帶來的好處,應該逐一分析
 – 語言特性帶來的優點(及其代價)
 – 編程典範帶來的優點
• 函數語言不是並行、平行程式的萬靈丹,但其
  編程典範相當適合並行、平行程式。
• 不要輕易相信或否定他人的說法
 – 試著獨立思考、驗證這些說法
Future Reading

• Actor Model
• Software Transactional Memory
• Persistence Data Structure
Thanks for your participation
       Any question?

More Related Content

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

Java DSL与动态代码生成技术的应用 (上集:DSL部分)
Java DSL与动态代码生成技术的应用 (上集:DSL部分)Java DSL与动态代码生成技术的应用 (上集:DSL部分)
Java DSL与动态代码生成技术的应用 (上集:DSL部分)悦 温
 
前端爆肝之旅+React上山前的小專案心得分享
前端爆肝之旅+React上山前的小專案心得分享前端爆肝之旅+React上山前的小專案心得分享
前端爆肝之旅+React上山前的小專案心得分享Yao Nien Chung
 
Java Script 引擎技术
Java Script 引擎技术Java Script 引擎技术
Java Script 引擎技术bigqiang zou
 
尼古丁加咖啡因,不瞌睡的简报設計模式 (Caffeine+Nicotine)
尼古丁加咖啡因,不瞌睡的简报設計模式 (Caffeine+Nicotine)尼古丁加咖啡因,不瞌睡的简报設計模式 (Caffeine+Nicotine)
尼古丁加咖啡因,不瞌睡的简报設計模式 (Caffeine+Nicotine)Dahui Feng
 
Java 基礎入門1
Java 基礎入門1Java 基礎入門1
Java 基礎入門1li1920li
 
Jaskell Core Parsec
Jaskell Core ParsecJaskell Core Parsec
Jaskell Core ParsecMarch Liu
 
Clojure简介与应用
Clojure简介与应用Clojure简介与应用
Clojure简介与应用Robert Hao
 
使用Dsl改善软件设计
使用Dsl改善软件设计使用Dsl改善软件设计
使用Dsl改善软件设计mingjin
 
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VMCompiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VMLi Hsuan Hung
 
信息系统开发平台OpenExpressApp
信息系统开发平台OpenExpressApp信息系统开发平台OpenExpressApp
信息系统开发平台OpenExpressAppzhoujg
 
Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]yiditushe
 

Similar to 那些函數語言Tutorial沒有教我的事 (14)

Hi Haskell
Hi HaskellHi Haskell
Hi Haskell
 
Java DSL与动态代码生成技术的应用 (上集:DSL部分)
Java DSL与动态代码生成技术的应用 (上集:DSL部分)Java DSL与动态代码生成技术的应用 (上集:DSL部分)
Java DSL与动态代码生成技术的应用 (上集:DSL部分)
 
前端爆肝之旅+React上山前的小專案心得分享
前端爆肝之旅+React上山前的小專案心得分享前端爆肝之旅+React上山前的小專案心得分享
前端爆肝之旅+React上山前的小專案心得分享
 
Java Script 引擎技术
Java Script 引擎技术Java Script 引擎技术
Java Script 引擎技术
 
beidakejian
beidakejianbeidakejian
beidakejian
 
尼古丁加咖啡因,不瞌睡的简报設計模式 (Caffeine+Nicotine)
尼古丁加咖啡因,不瞌睡的简报設計模式 (Caffeine+Nicotine)尼古丁加咖啡因,不瞌睡的简报設計模式 (Caffeine+Nicotine)
尼古丁加咖啡因,不瞌睡的简报設計模式 (Caffeine+Nicotine)
 
Java 基礎入門1
Java 基礎入門1Java 基礎入門1
Java 基礎入門1
 
Jaskell Core Parsec
Jaskell Core ParsecJaskell Core Parsec
Jaskell Core Parsec
 
Clojure简介与应用
Clojure简介与应用Clojure简介与应用
Clojure简介与应用
 
使用Dsl改善软件设计
使用Dsl改善软件设计使用Dsl改善软件设计
使用Dsl改善软件设计
 
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VMCompiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
 
信息系统开发平台OpenExpressApp
信息系统开发平台OpenExpressApp信息系统开发平台OpenExpressApp
信息系统开发平台OpenExpressApp
 
Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]
 
函数式编程
函数式编程函数式编程
函数式编程
 

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

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