Scalaハマりポイント

Scala始めて1ヶ月くらい経つけど、良くわからないことがまだたくさんある。

OptionとEitherってどう使い分けるんや !!

ScalaではOption型とEither型が使えて、どちらも正常値or異常値を入れられるみたいな感じなんだけど、どういうときに使い分けたら良いか分からなかった。

しばらく書いてたら分かってきて、Optionは成功or失敗を表すとき、Eitherは意味が正しいか正しくないかを表すときに使うってことが分かった。

とりあえず何か値を取り出せるかどうかみたいなときはOptionを使うと良くて、取り出した値が正しいか正しくないかみたいな判別をしたいときに、Eitherを使うと良い。

matchにtoRightするのは括弧つけなあかん !!

match式の戻り型は、各caseの共通の親クラスになっているけれど、それに対してメソッド呼びたいときは()で囲う必要がある。 例えば、こういうmatch式書いたとする。

foo match {
  case hoge => Some(fuga)
  case piyo => None
}

fooの型がhogeのときはEitherのRightにSome(fuga)を、piyoならEitherのLeftにエラーメッセージを入れて返したくなったときは、こう書く。

(foo match {
  case hoge => Some(foo)
  case piyo => None
}).toRight("error")

matchを囲っている()を忘れるとコンパイルエラーになるので注意

foo match {
  case hoge => Some(foo)
  case piyo => None
}.toRight("error")

matchの内側が部分関数みたいになってて、toRightを括弧を付けずに書くと、この部分関数全体にtoRightすることになる?みたい (良く分かってない) たぶん、forの後のyieldにtoRightとかを括弧無しで書くと同じことになるので、とにかくforとかmatchにtoRightしたいときは括弧つけたほうが良さそう。