来世から頑張る!!

技術ブログを目指して

Optionがモナドだったなんて・・・orz

いやね、Scalaの話なんですけどね、何の話かってね、Option型がOption("a")とかってやって生成できるの。。。

> val a = "abc"
a: String = abc

> val o = Option(a)
o: Option[String] = Some(abc)

今までずっとSome(a)NoneでしかOption生成できないと思っていた自分が恥ずかしくて(><;;

いや、ね、Monadには単位元というかreturnpurepoint
とにかくscalaapplyに当たる何かがあることが定義上必要なんですよ。

つまり絶対Option(???)で何か生成できるはずなのに、なぜか出来ないって思いこんで居たっていう。。。

で、なんでこんな話をしているかというと、Javaのライブラリを使う時のnull対策。

> val a: String = null
a: String = null

> val o = Option(a)
o: Option[String] = None

この通り、nullの値の変数をOptionにapplyするとちゃんとNoneを返してくれる!!!

つい先日apache poiのためのscalaを(spoiwoは微妙に古いので)自作していたんだけど、 これが結構nullが返ってくる。

その時書いてたコードがこちら

def getRow(idx: Int)(sh: Sheet): Option[Row] = {
  val r = sh.getRow(idx)
  if (r == null) None else Some(r)
}

これ、全部Optionのapllyでいいじゃんっていう・・・

是非これからやる人は読みやすい方を使ってください。。。