1

我一直在比較Scala和Java在併發編程方面的優點。函數式編程如何避免副作用

很顯然,我走了過來,第一點是Scala是一種函數式編程語言中使用FP避免副作用(部分)自然

相對於命令式語言的副作用如何避免在函數式編程和它是如何工作的多線程/併發編程?

+2

「Scala是一種可以自然避免副作用的函數式編程語言」這是不正確的。斯卡拉不是功能純正的語言,它不會避免副作用。它提供了比Java更多的控制狀態和程序流的方法,是的,但它不會限制你編寫副作用代碼。 –

+0

@VladimirMatveev編輯 – shiva

+1

說了這麼多,[scala有一個插件](http://lrytz.github.io/slides/lamp-lara-efftp.html),它允許你檢查編譯時間和編譯失敗期間的副作用預計將是純粹的作品。 –

回答

5

什麼是語句的意思是,我認爲,斯卡拉作爲功能-OO 混合語言鼓勵(有時啓用)您使用的功能結構和規則,將結果沒有副作用。你可以編寫非功能性有狀態的Scala代碼,並帶有副作用;-)另一方面,你可以嘗試編寫功能性的Java(例如),但由於函數不是頭等類的對象,所以它可能看起來很醜。所以我不會說這樣做很自然,但更多的是在某些方面幫助你,總體上鼓勵你這樣做。

那麼有幾個校長,你應該堅持做函數式編程這結果讓你無副作用時:

  • 不變好 - 更喜歡那些曾經創造,不能被修改的結構。例如,在Java列表中,您可以修改第n個元素,但在Scala中,您可以使用新元素返回該列表的副本。是的,這可能意味着程序中有更多的對象,但也應該導致更多的可重用和更安全的代碼。
  • 通值作爲參數,不存儲狀態的成員變量 - 共享狀態是許多問題的原因和管理共享狀態是有問題的(比如你需要用鎖等)
  • 喜歡重複計算值如果不是緩存它們價格便宜,(這有一些例外,例如http://en.wikipedia.org/wiki/Memoization規則是一個非常常用的技術!)

事實上的避免副作用的一個最大的優點按照上述規則更容易併發編程!畢竟併發編程的最大障礙是管理共享狀態!

由於其中一個規則是可變和共享狀態不好,所以不要使用它!相反,許多函數式語言(如Erlang或Scala)更喜歡所謂的Actor模型,其中Actors(您可以與線程進行比較)僅通過向對方發送消息進行通信(請參閱傳遞值而不是將它們存儲在某處!)。