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沒有教我的事

使用Dsl改善软件设计
使用Dsl改善软件设计使用Dsl改善软件设计
使用Dsl改善软件设计
mingjin
 
信息系统开发平台OpenExpressApp
信息系统开发平台OpenExpressApp信息系统开发平台OpenExpressApp
信息系统开发平台OpenExpressApp
zhoujg
 
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?