scalazのEither(Disjunction)のorElse

以下のpull reqの意味が最初よくわかってなかったのだけど、さっき試して理解したのでメモ

https://github.com/scalaz/scalaz/pull/1021



scala> import scalaz._, syntax.either._
import scalaz._
import syntax.either._

scala> class A; class B; class C; class D;
defined class A
defined class B
defined class C
defined class D

scala> val ab = (new A).right[B]
ab: scalaz.\/[B,A] = \/-(A@24e0b258)

scala> val cd = (new C).right[D]
cd: scalaz.\/[D,C] = \/-(C@11da9f6e)

ここ ↑ まで下準備



変更前

scala> ab orElse cd
res0: scalaz.\/[Object,Object] = \/-(A@24e0b258)

変更後

scala> ab orElse cd
res0: scalaz.\/[D,Object] = \/-(A@686cb818)


変更前だと、余計な制約があることによって、もっと型の範囲を狭くできるのに必要以上に広くなってしまう(AnyRefやAnyなどになってしまう)ということですね