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

22
那那那那那那 Tutorial 那那那那那那 那那 (@miaout17) OSDC 2013

Upload: yc-ling

Post on 24-Jun-2015

4.570 views

Category:

Documents


0 download

TRANSCRIPT

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

那些函數語言 Tutorial沒有教我的事大貓 (@miaout17)

OSDC 2013

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

About me

• 大貓 , YC Ling, @miaout17– 感冒中,聲音有點啞請見諒 m(_ _)m

• Game developer, 2007~2010• Web (backend) developer, 2010~now• http://about.me/miaout17

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

Why I started to learn FP?

(2007 年 )聽說,函數語言適合寫平行、並行的程式

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

The Next Mainstream Programming Language: A Game Developer’s Perspective (2006)

Tim Sweeney, CEO of Epic Games

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

說好的困境呢?

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

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

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

Outline

• 函數語言的各種特性• Pure Function & Side Effect• Immutable Data Structure• Conclusion

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

關於範例程式碼• 以下投影片中,會使用 C++, Java, Scala,

Haskell, Erlang 做為範例• 不需要讀懂所有程式碼,只要理解我介紹

的語言特性即可

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

函數語言的各種特性

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…

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

Side Effect

• 函數語言沒有副作用?• 函數語言中的函數都是純函數?

• 什麼是純函數?– 沒有副作用– 給與相同參數,得到相同結果

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

所有程式都有 Side-Effect

• 修改記憶體狀態• 在螢幕上顯示資訊• 將結果輸出至檔案

重點不是「避免副作用」,而是區分「有副作用」及「沒有副作用」的 function

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

Pure Function - C++C++: Pure FunctionC++: Impure Function

Output: 12624120…

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

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]

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

Pure Function – HaskellSingle Assignment & IO Monad

Pure

Shorter

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

Side Effect & Pure Function – 小結• 函數語言沒有副作用?– 命題沒有意義。所有程式都有副作用。

• 函數語言中,所有函數都是純函數?– 大多數的函數語言無法保證函數是純函數。 (Ex. Lisp, Scheme, Scala…)– 少數語言有單一賦值特性,可避免廣域變數造成副作用。

(Ex. Haskell, Erlang…)– 少數語言可用型別系統區別純函數與非純函數。 (Ex. Haskell…)

• 使用函數語言就不用擔心副作用的問題了 (X)• 學習函數語言的編程典範,能對純函數、副作用

等概念有更透徹的理解 (O)

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

Immutable Data Structure

• 函數語言中,資料都是不可變 (Immutable) 的?• 使用函數語言,就不必擔心平行程式中,共享

可變狀態的問題了?

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

Immutable Data Structure – Java, ScalaJava Scala

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

Immutable Data Structure - Haskell

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

Immutable Data Structure – 小結• 函數語言中,資料都是不可變 (Immutable) 的?– 只有 Haskell, Erlang 等少數語言保證資料結構不可變。

• 如何確保資料結構不可變?– 語言保證所有資料結構皆不可變 (Ex. Haskell, Erlang)– 將特定資料結構宣告為不可變 (Ex. Scala, Java, C++…)– 約定與紀律

• 使用函數語言,就不必擔心平行程式中,共享可變狀態的問題了 (X)

• 學習函數語言的編程典範,能對純函數、不可變資料等概念有更透徹的理解 (O)

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

Conclusion• 現今「函數語言」其實是指很多具有不同特性

的語言,很難一言概括分析。• 分析語言帶來的好處,應該逐一分析– 語言特性帶來的優點(及其代價)– 編程典範帶來的優點

• 函數語言不是並行、平行程式的萬靈丹,但其編程典範相當適合並行、平行程式。

• 不要輕易相信或否定他人的說法– 試著獨立思考、驗證這些說法

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

Future Reading

• Actor Model• Software Transactional Memory• Persistence Data Structure

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

Thanks for your participationAny question?