ここまで、1つのEitherに対する演算について見てきました。今回から、2つのEitherに対する二項演算について考えていくことにします。
今回はEitherに対する二項演算のバリエーションについて整理します。
Eitherに対する二項演算を考える上では、EitherそのものとEitherに格納される値という2つのレイヤそれぞれに対する二項演算を考えなくてはなりません。
- Eitherそのものに対する二項演算
- 値に対する二項演算
以下で、それぞれについてみていきましょう。
Eitherそのものに対する二項演算
Eitherは、LeftまたはRightのいずれかなので、2つのEitherの組合せは以下の4パターンになります。以下では二項演算の第1引数(左側)をlhs(left hand side)、第2引数(右側)をrhs(right hand side)と表現します。左右という表現になっていますがEitherのLeft, Rightとは別のものなのでご注意ください。
lhs | rhs |
---|---|
Right | Right |
Right | Left |
Left | Right |
Left | Left |
lhsとrhs共にRightまたはLeftの場合には、Right内またはLeft内に格納される値間の二項演算を行います。
問題なのが、lhsとrhsがRight/LeftやLeft/Rightのように別のものになる場合です。この場合は、Right/LeftとLeft/Rightの対に対してRightまたはLeftのどちらかを結果とするEitherレベルでの二項演算が必要になります。
スコープをEitherの慣用的な使い方である「Leftが失敗、Rightが成功の成功失敗文脈」とした上で、Leftを偽、Rightを真と考えると、Eitherレベルでの二項演算のセマンティクスとしては、16種類の論理演算が候補になります。
ここでは論理和(以下OR)と論理積(以下AND)の2種類を考えることにします。(排他的論理和(XOR)や含意(IMP)も面白そうです。このあたりを追求していくと面白いイディオムが見つかるかもしれません。)
Rightを成功文脈として考えた場合のEitherのORは以下のものになります。
lhs | rhs | 結果 | Rightの値 | Leftの値 |
---|---|---|---|---|
Right | Right | Right | 二項演算 | - |
Right | Left | Right | lhs | - |
Left | Right | Right | rhs | - |
Left | Left | Left | - | 二項演算 |
またANDは以下のものになります。
lhs | rhs | 結果 | Rightの値 | Leftの値 |
---|---|---|---|---|
Right | Right | Right | 二項演算 | - |
Right | Left | Left | - | rhs |
Left | Right | Left | - | lhs |
Left | Left | Left | - | 二項演算 |
値に対する二項演算
値に対する二項演算は、以下のものが考えられます。
- lhs
- lhs側を使う
- rhs
- rhs側を使う
- f(lhs, rhs) :: 任意の関数で計算
- lhs |+| rhs :: Monoidで計算
- lhs <+> rhs :: Plusで計算
次回より、Eitherに対する二項演算、値に対する二項演算の組合せに対して具体的なイディオムを考えていきます。
0 件のコメント:
コメントを投稿