こんにちは、アドベントカレンダー17日目です。
導入
現在自分はScalaを利用、学習しているのですが、Either型について気になっていることがあります。
それはズバリ、右と左のどちらにも自由な値を入れられるのに、どうして左には異常系を、右には正常系を入れる形になっているのかです。
処理結果の返却だと、Rust等ではResult型が用いられていることもあり、そちらは左が正常系(Ok)、右が異常系(Err)となっています。文等で並べるときは基本「OK, NG」のように、「正常, 異常」の順で書いた方がわかりやすいと思う(少なくとも筆者はわかりやすいと感じている)ので、Eitherでは反対になっている理由が気になっている感じです。
Either型のドキュメントを調べる
Scalaの公式ドキュメントを読むと、慣例として左には失敗したものを、右には成功したものを入れるとなっており、具体的にどうしてそうなったのかに関しては書かれていませんでした。
Convention dictates that Left is used for failure and Right is used for success.
https://scala-lang.org/api/current/scala/util/Either.html
そこで次はEither型が使い始められた言語を探したところ、一番Either型を広めたのがHaskellっぽいことがわかったので、Haskellのドキュメントを見てみます。
Haskellのドキュメントにも、だいたい同じことが書かれていますが、最後の覚え方の補足として、「右」の英語 "right" が「正しい」という意味も持っている話が書かれています。 that's right! の right ですね。
これは慣例になった理由の一つとしてありそうです。
by convention, the Left constructor is used to hold an error value and the Right constructor is used to hold a correct value (mnemonic: "right" also means "correct").
https://hackage.haskell.org/package/base-4.21.0.0/docs/Data-Either.html
JavaのライブラリであるvavrでもEither型が用意されていますが、こちらは同じく慣例としか書かれていませんでした。
By convention the success case is Right and the failure is Left.
https://www.javadoc.io/doc/io.vavr/vavr/0.10.0/io/vavr/control/Either.html
慣例について調べる
もう少し調べると、Haskell-cafeというコミュニティで同じ質問をしていた人がいました。
中身を見ると、上記の語呂合わせはもちろん、多くの人は右利きだし、昔は右の方が正しいということが多かったという話をしている方もいました。あまり深掘りはしませんが、歴史的に左利きはマイノリティであったり、不浄の手という話も宗教によってはあるので、その文脈もあるのかもしれないです。データベース冗長化におけるmaster/slaveやgitのmaster等も、そのような理由から呼び名が変わっていったので、1つの説としてはありえそうです。
Historically it has been related to negativity in many cultures.
(Consider "sinister", cognate of Italian "sinistro/a", and the
prevalence of and preference for right-handed-ness.)
[Haskell-cafe] Why Either = Left | Right instead of something like Result = Success | Failure
https://groups.google.com/g/fa.haskell/c/M_WjyS7IfVE
左利きのページ
https://ja.wikipedia.org/wiki/%E5%B7%A6%E5%88%A9%E3%81%8D
Haskellの仕様について調べる
そもそものHaskellの仕様として、mapやflatMapのような値の操作は1つの箱しか対象にできないという制約があるようです。Eitherのように、2つからどちらか1つを選ぶ必要があるとき、Haskellのルールでは常に「最後に書いた方」が選ばれる仕組みになっています。
そう考えると、成功したパターンをそのまま操れる方が便利という話です。
Note that for any type constructor with more than one parameter (e.g., Either), only the last type parameter can be modified with fmap (e.g., b in Either a b).
https://hackage.haskell.org/package/base-4.21.0.0/docs/Data-Functor.html
まとめ
主観にはなりますが、最初はHaskellの制約上、都合が良かったので右側が成功になり、後付けで「右」と「正しい」の意味が被っていたのが広がったのだと思われます。実際、別に左側に成功結果を入れても、問題はないですからね。
現在は成功/失敗を表すものとしてはResult型の方が採用されている印象があります。Rustだと、昔はEither型とResult型の両方がありましたが、最終的にResult型のみ標準に残ったみたいです。Result型だとSuccess/Failureで分かりやすいのが良いと思います。
どちらも利用する方は位置を間違えないようにしましょう。