0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Option型がSomeであるときのみ特定の処理をするときのメソッド名が foreach なのか

Last updated at Posted at 2019-10-15

前提

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 , foreach1 へ定めた
  • 「Option型の変数で中身があるとき(Some)のみ特定の処理を実行したい」というメソッドはHaskellの fmap , <$> とほぼ同じ

以上のように、Option型上でのメソッドをモナド操作へ寄せたい欲求と関数型と手続き型の微妙なすり合わせが重なった結果名前と実際の挙動が一致しない奇妙なメソッドが生まれた、というのが真相のようです。
もし手続き型言語のforeachに寄せず、Haskellの doに寄せていれば、Option型でも自然なメソッド名になっていたと思います。

  1. 関数型であるHaskellには返り値が存在しないforeachに当たるものがないため厳密には対応しているわけではないが、foreachのために糖衣構文があることからもScala側がモナドに寄せる目的でforeachを扱っていることは明白

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?