タイトルのことを調べようとしていて、三ヶ月に同じことを調べていたのでブログにメモしておきます…。主に↓に書いてある内容以上のことはありません。前より早く理解できたり、理解が深まったりしたので、進捗していると思いたい。
Scalaの場合
Scalaの関数の場合、以下のケースが多いと思います。
- 値が存在しない場合もあるときは
Option[A]
を返す- 例: DBから値を引いてきたけど、存在しないときは
None
を返す
- 例: DBから値を引いてきたけど、存在しないときは
- 失敗するかもしれない処理で、失敗した場合は理由も返して欲しいときは
Either[A, B]
を返す- 例: 外部との通信で破壊的な処理が失敗するかもしれないので、
Left("Could not delete user")
を返す Try
でSuccess
かFailure
というパターンもできる
- 例: 外部との通信で破壊的な処理が失敗するかもしれないので、
Some
やRight
になっているもの同士の演算は取り出してくるんで…と手で丁寧にやっていると疲れるし読むのも大変です。map
やflatMap
、for
を組み合わせると書くのも楽になるし、読むのも楽になります。Haskellの本で勉強した。
- 作者: Miran Lipovača,田中英行,村主崇行
- 出版社/メーカー: オーム社
- 発売日: 2012/05/23
- メディア: 単行本(ソフトカバー)
- 購入: 25人 クリック: 580回
- この商品を含むブログ (71件) を見る
どれを使うにしてもパターンマッチでかちっとできるのは書いてても読んでても安心できますね(特にsealed traitなどを使っている場合)。
Javaの場合
ScalaのプロジェクトでもJavaのライブラリを使うことはよくよくあると思いますが、Javaの場合は失敗するかもしれない処理でもOption
やEither
を返さず例外を吐くことが多いです。以下のように、一旦Option
やEither
でくるむとScalaの場合と同じように扱うことができてよさそうですね。
allCatch opt
=> 例外吐いたときはNone
にして、成功した場合はSome
でくるんで返してくれるallCatch either
=> 例外を吐いたときはLeft
にして、成功した場合はRight
でくるんで返してくれる