前提
Option型の変数で中身があるとき(Some)のみ特定の処理を実行したいときは foreach
メソッドまたはfor文を使うことを理解している。
問題
val nameOption: Option[String] = Some("bob")
nameOption.foreach(println)
Option型は0個または1個の要素を含むクラスなので、 それぞれに(each) 対して(for) というメソッド名は不自然に感じます。
なぜ上述のメソッドの名前が foreach
なのでしょう。
回答
以下の回答にはいくらかの憶測が含まれています。
もし異論が有る方またはここが間違っているという点がありましたらコメント等で教えていただければ助かります。
短い回答
ざっくり言うと歴史的経緯
長い回答
- Scalaの言語仕様(とOption型を含む標準ライブラリ)はHaskellのfunctor, applicative functor, monad概念に強く影響を受けている
- ScalaではHaskell由来のMonad系の概念と既存の手続き型の概念(foreach, map)を両立させるため、名前を手続き型伝統の名前に寄せた
- Haskellの
fmap
,<$>
に対応するScalaでのメソッド名をmap
,foreach
1 へ定めた
- Haskellの
- 「Option型の変数で中身があるとき(Some)のみ特定の処理を実行したい」というメソッドはHaskellの
fmap
,<$>
とほぼ同じ
以上のように、Option型上でのメソッドをモナド操作へ寄せたい欲求と関数型と手続き型の微妙なすり合わせが重なった結果名前と実際の挙動が一致しない奇妙なメソッドが生まれた、というのが真相のようです。
もし手続き型言語のforeachに寄せず、Haskellの do
に寄せていれば、Option型でも自然なメソッド名になっていたと思います。
-
関数型であるHaskellには返り値が存在しないforeachに当たるものがないため厳密には対応しているわけではないが、foreachのために糖衣構文があることからもScala側がモナドに寄せる目的でforeachを扱っていることは明白 ↩