タイトルのことを調べようとしていて、三ヶ月に同じことを調べていたのでブログにメモしておきます…。主に↓に書いてある内容以上のことはありません。前より早く理解できたり、理解が深まったりしたので、進捗していると思いたい。
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でくるんで返してくれる