はじめに
「Option型は長さ1のリスト」と解釈すると,ScalaのOptionに関する理解が深まったのでメモ.間違ったことが書かれていたりしたら,指摘お願いします.
Option型
まず,Option型について説明します.Optionは抽象クラスであり,サブクラスはSomeとNoneの2つです.また,リストと同様に,Option型はmapメソッドやfilterメソッドなどのコレクションメソッドを所持しています.そのため,Option型は構造的には長さ1のリストと考えることができます.
以下,Option型とList型の類似性をコードによって示します.
(例)map
Listのmapと同様に、Optionのmapは、内包する要素に対して関数を適用します。
val opt: Option[String] = Some("some")
opt.map(_.toUpperCase).foreach(println) // SOME
val lst: List[String] = List("list")
lst.map(_.toUpperCase).foreach(println) // LIST
(例)flatten
val optionNums: List[Option[Int]] = (1 to 10).map(Some(_)).toList
println(optionNums.flatten) // List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val listNums: List[List[Int]] = (1 to 10).map(List(_)).toList
println(listNums.flatten) // List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
(例)畳み込み
val opt: Option[String] = Some("some")
println(opt.fold("NONE")(_.toUpperCase)) // SOME
val lst: List[String] = List("list")
println(lst.foldLeft("LIST")(_ + _)) // LISTlist
結論
Option型を長さ1のリストと解釈すると,Option型について理解しやすい気がします.