2015/07/25

[ScaVa->Scala] 什麼是Monad?

什麼是Monad?

我一直不想寫這篇! 因為這很難解釋…我自己查個半天網路上的解釋看的都眼花了。

不信? 你看看Wiki上的定義:

Monad,單元(unit)的拉丁語,來自範疇論的一種技術,其已經被採用作為處理在功能性程序設計語言中狀態的一種方式,其使用 monads 來構建包含必須以特定順序來執行的操作程序。Monads 在功能性程序設計中的主要應用是表達輸入/輸出和改變狀態而不使用帶來副作用的語言。一個 monad 由三部分組成:增加一個現有類型的意思,從原始類型的值中創建一個新類型默認值的意思,和對與新的類型一起工作的舊的類型的基本應用程序操作符的一個替代。

………看得懂有鬼! (不然就是我的語言理解能力太差)

若是以實例來了解Monad之後,再回來看這段文字,其實勉強可以猜出他的描述。

網路上找到的一些例子中,在Scala裡最常舉的例子就是Option和Future了,接下來我試著以我的了解來解釋。
  • Monad是一種Pattern,而他的目的,當然是想讓程式寫起來更簡單、看起來也更簡單,所以他把一些多餘的程式碼給省略,這也是Functional Programming的程式寫起來很精簡易讀的幫手之一。
  • Monad讓你把原來型態的物件多包起來,所以會看到M[T],這個M就是某一種Monad,而T是你原來物件的型態,像是Option[String],就是Option的Monad而裡面的型態是String。
  • Monad雖然幫你把他包起來,但還是能讓你處理原來的型態,甚至能轉換成另一個型態,使用map或flatMap之類的可以把M[A] 轉成 M[B],就像是Option[String]可以轉成Option[Int],而你只要寫"怎麼轉"就行了。
  • Monad在轉型之後的M[B]當然還是個Monad,可以繼續不斷的以Monad的特性處理下去。

Option Monad

寫過程式的人都一定知道NullPointException,有跟潮流的人也知道現在的趨勢是不要再亂丟null了。
早期寫C#就有Nullable的型態、Swift也有Optional,現在Java 8也有Optional的型態,在Scala中的Option主要的目的也是一樣,就是幫你把null包起來,然後可以進行下面這些的動作。
  • 可以透過 .isEmpty問問他是不是空值
  • isDefined看看他是不是有值
  • get去抓他實際的值
  • getOrElse抓值的同時如果值不存在順便回傳預設值。
但是若這樣在寫code的時候,就會像以下這樣:

這樣寫起來還是很麻煩啊! 一堆的if/else要判斷!
所以Option Monad提供的map, flatMap其實就幫你把if/else這些處理掉了! 你直接在map裡給他一個你要把Type A轉成Type B的實作就行了!

Future Monad

Future就是個未來嘛! 他也是一個Monad,所以他也能讓你在不管Future的情況下,針對裡面的東西做處理(或轉成別的型態)。

就好像是傳入一個function,而這個function定義的是"等你拿到這個值的時候,把這個值怎樣怎樣的處理",你的function只要專心的定義拿到值要怎麼處理就行。


看完了這些解釋,是否對Monad有些了解了呢? 這時候再去看一開始wiki那段文言文,應該比較有感覺了吧!
張貼留言

My World