2015/07/20

[ScaVa->Scala] 好用的Scalaz - Either (Disjunction)

在Scala中,exception handling的方式,除了把Exception丟出來再自己把他抓起來(catch)之外,有另外的一種寫法,就是Try幫你包起來,但是用來用去,有時候還是喜歡自己用Either,因為可以自己定義自己的Right(正確的)和Left(非正確的)的型態,(不然每次處理Try的時候,還是要看看他是Success或是Failure,再將Failure的case中組成自訂的回傳型態往外丟)。

而使用Either就能清楚的在function中回傳的部份,表示是"對的型態"或是"錯的型態",如下面的sample code:

這樣的定義上,其實若是依照Functional Programming常用的Monad的處理方式,就能很方便的用一些map,flatmap,getOrElse一路串著寫下去。(Monad我還真的不知道怎麼解釋他,等改天能用自己的話來解釋時,我再補上。)

但是Scala中的Either卻不是Monad!! 所以這邊強力推薦使用Scalaz的"\/"(Disjunction,就是either的概念,但他是monad)

從下面的sample中,就可以看得出來,基本上Either的操作都沒問題,最重要的是能直接使用map, getOrElse等這些方便的東西!
(他會假定你要的都是"right"的,所以你的map取到的會是right的型態的值,若是left的話,就不會進入map)

參考資料:Learning Scalaz

張貼留言

My World