2011-05-09
List, Either, Option を for 構文で使う話しの続き(toSeq, toRight, toOption を使いこなしてますか?)
Scala for = Haskell do (Java の例外を Either で包んだ後の話し) が少し好評だったので、調子に乗ってちょいネタ。
for 構文を使うと match case のネストを避けられるけれど、じゃー、下記のように書けるのかと言うと…
for { a <- Some(1) b <- Right(2).right } yield a
"type mismatch" と怒られるハズです。何故か?
上記を map と flatMap を使った形式に変換すると下記のようになります。*1
Some(1).flatMap(a => Right(2).right.map(b => a))
Option の flatMap の型は下記の通りであり…
def flatMap [B] (f: (A) ⇒ Option[B]) : Option[B]
Option[B] が求められている箇所に Product with Either[Nothing,Int] with Serializable を与えているので "type mismatch" で怒られます。
では、どうするかと言うと…、下記のように 型 を揃える以外に方法はありません。
for { a <- Some(1) b <- Right(2).right.toOption } yield a
当然、下記の for 構文の値は None です。
for { a <- Some(1) b <- Left(3).right.toOption } yield a
None ではなく、詳細なエラーの内容が必要な場合は、下記のようにします。
for {
a <- Some(1).toRight(new Exception("None")).right
b <- Right(2).right
} yield a
toRight には、left の値を指定します。*2
下記の for 構文の値は Left(new Exception("None")) と等価です。
for {
a <- None.toRight(new Exception("None")).right
b <- Right(2).right
} yield a
ちなみに、List には toRight や toOption は存在しないので、Option や RightProjection/LeftProjection の toSeq を用いる必要があります。
トラックバック - http://d.hatena.ne.jp/cooldaemon/20110509/1304909992
リンク元
- 44 http://www.google.co.jp/url?sa=t&source=web&cd=1&ved=0CBkQFjAA&url=http://d.hatena.ne.jp/cooldaemon/20060328/1143527705&rct=j&q=vim バッファ ショートカット&ei=o3T
- 29 http://longurl.org
- 12 http://www.google.co.jp/url?sa=t&source=web&cd=1&ved=0CBwQFjAA&url=http://d.hatena.ne.jp/cooldaemon/20080620/1213942154&rct=j&q=centos yum repository ローカル&ei=36nITeXlE4ekuAOx6I3zBQ&usg=AFQjCNEbO1Tg8TWt9t1n
- 12 http://www.google.co.jp/url?sa=t&source=web&cd=2&ved=0CCAQFjAB&url=http://d.hatena.ne.jp/cooldaemon/20081203/1228279673&rct=j&q=Selenium 緇????&ei=zqjHTf7BH4XcvQPJpq2hAQ&usg=AFQjCNEudWWOth4RBI9vVlkPSOgMBKBK_A
- 10 http://www.google.co.jp/url?sa=t&source=web&cd=3&ved=0CCcQFjAC&url=http://d.hatena.ne.jp/cooldaemon/20060615/1150369551&rct=j&q=hobbit-clients.cfg&ei=I_3JTe6fH4mwvgPI5ozVBQ&usg=AFQjCNFPH_7x7tClsc2KOKNpQYz7hipRiQ&sig2=RfXsjzPRQm1doR-rCGjQzw
- 9 http://reader.livedoor.com/reader/
- 9 http://www.google.co.jp/search?q=mysql AES+256&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&hl=ja&client=firefox-a
- 9 http://www.google.co.jp/url?sa=t&source=web&cd=2&ved=0CCMQFjAB&url=http://d.hatena.ne.jp/cooldaemon/20070720/1184903937&rct=j&q=mac ports svn&ei=x-3JTeLNL4O6vQPB4eDsBQ&usg=AFQjCNHMiz-ThVb3OTS5IoHocC1IfDWCmg&cad=rja
- 9 http://www.kt.rim.or.jp/~kbk/zakkicho/
- 8 http://search.minakoe.jp/rsss/rsss.asp?pgsz=100&qry=java¬wit=1&twit=0&debug=1&multi=1