[2012-06-18 Update: details of new branch added, where Either gains right-biased capability while retaining its unbiased one.]
[2012-06-25 Update: details of new branch added, where Either gains a withFilter method.]
[2012-06-29 Update: link to SIP candidate added.]
This latest effort is the result of a stalled attempt to write a formal proposal (
SIP) explaining exactly how
scala.Either should be fixed.
It became apparent that the need to first deprecate things, as opposed to simply removing them, might make the approach I was advocating less attractive.
So, with a view to helping the community to come to an informed decision, I now present a workable set of changes that leaves
scala.Either unbiased, together with one that gives it a bias towards its
Right subtype, for comparison.
Unbiased
To
recap, we wish to make the following changes to
Either's
Left-/RightProjection inner classes:
- have map return a Left-/RightProjection instead of an Either
- have flatMap also do this, and also take an A => Left-/RightProjection instead of an A => Either
- remove filter
Although we can deprecate
filter, we cannot do this to the existing versions of its
map and
flatMap.
Therefore, we have no choice but to deprecate
Left-/RightProjection themselves, and in turn,
Either's
left and
right methods.
The alternative names I came up with are
Left-/RightProj,
lp and
rp. At least they are shorter, and anyway,
left and
right would no longer be correct, since their
map and
flatMap now return a
Left-/RightProj instead of an
Either.
One advantage of this is that we can now just leave out
filter, rather than have to deprecate it.
Right-Biased
Here we need to do the following:
- deprecate Either's left and right methods
- deprecate Left-/RightProjection themselves
- add the following methods to Either itself
- get
- getOrElse
- foreach
- forall
- exists
- flatMap
- map
- toSeq
- toOption
Note the absence of
filter.
Decision time
Please take a look at the
unbiased (
lp_rp branch) and
Right-biased (
right-biased branch) end results, together with the respective versions of the accompanying test code:
The reasons to remain unbiased, which occur to me, are as follows,
- any use-cases demanding the ability to choose from which subtype (Left or Right) the value passed to map, etc. is taken, will not be excluded
- Either does not imply any bias, although Left and Right do imply a weak one
while those to go biased, would seem to me to be that,
- there is no need to append .rp (or .lp) in for comprehensions, which must be done for each generator
- there is no need to append .e in order to obtain the Either from the result yielded.
Please register your preference on this scala-debate
thread, or else below.
Thanks!
2012-06-18 Following a highly productive exchange of ideas on the above thread, a new branch entitled
add_right-bias_2-10 has been added to the project. In this version of
Either, the question of unbiased vs biased goes away! Since these two usage modes turn out not to be mutually exclusive, a right-bias has been
added, and the existing unbiased capability (through the
lp and
rp methods) retained.
2012-06-25 add_right-bias_2-10_withFilter branch added to the project. This version adds a
withFilter method to
Either, such that right-biased
for comprehensions may now use
if and involve refutable pattern-matching, provided the appropriate implicit conversions are supplied (as indicated by the compiler), that will be used to create a
Left value whenever the expression following
if is
false, or there is no match.
2012-06-29 SIP candidate now written.