那些函數語言Tutorial沒有教我的事
Transcript of 那些函數語言Tutorial沒有教我的事
那些函數語言 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?
http://www.quora.com/Why-does-functional-programming-favor-concurrency
First result of Google “functional programming concurrent”…
Multi-Core FunctionalProgramming
No SideEffect
ImmutableData
Concurrency
Outline
• 函數語言的各種特性• Pure Function & Side Effect• Immutable Data Structure• Conclusion
關於範例程式碼• 以下投影片中,會使用 C++, Java, Scala,
Haskell, Erlang 做為範例• 不需要讀懂所有程式碼,只要理解我介紹
的語言特性即可
函數語言的各種特性
Lisp, SchemeErlang, Haskell, Clojure, ScalaPerl, Ruby, Python, JavaScript
C++11, C#3.0, Java8…
FunctionalProgramming
First-ClassFunction
Higher-OrderFunction
FunctionComposition
PartialApplication
Monad
Category
Arrow
Haskell… SingleAssignment
ImmutableData Structure
PureFunctional
No SideEffect
Haskell…
Haskell, Erlang…
Side Effect
• 函數語言沒有副作用?• 函數語言中的函數都是純函數?
• 什麼是純函數?– 沒有副作用– 給與相同參數,得到相同結果
所有程式都有 Side-Effect
• 修改記憶體狀態• 在螢幕上顯示資訊• 將結果輸出至檔案
重點不是「避免副作用」,而是區分「有副作用」及「沒有副作用」的 function
Pure Function - C++C++: Pure FunctionC++: Impure Function
Output: 12624120…
Impure
Pure
Pure Function – ErlangSingle Assignment
print_factorical(5, 1, 1) 1print_factorical(5, 2, 1) 2print_factorical(5, 3, 2) 6print_factorical(5, 4, 6) 24print_factorical(5, 5, 24) 120
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 – HaskellSingle 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, ScalaJava 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 participationAny question?