ScalazのEqualと、ScalaUtilsの似たような何かの比較

"似たような何か"って酷いですが、なんて呼べばいいんでしょうか?

ScalaUtilsという、ScalaTest作者が作ってるライブラリの中に、似たよう何かがあるわけですが、それを一言でいう場合、"Equality"ですか、"Equivalence"ですか、"TypeCheckedTripleEquals"ですか?

http://www.scalautils.org/

まぁそれの話です。



少し前の rpscala でこれの話題になったのですが
http://blog.pab-tech.net/2013/10/25/rpscala.html
周回遅れで(?)、twitter上で本人が議論してたのでまとめました

http://togetter.com/li/589896


流れとしては

  • scalautilsのTypeCheckedTripleEqualsいいよね
  • え、それScalazでいいのでは?
  • Scalazで任意の新しい型で===を使いたい場合どうするの?たとえば case class Person(name: String)とか
  • import Equal.auto._とかすればいいのでは?(なんだか雑な返し・・・)
  • おもしろいけど、それどのScalazのversionでできるの?(雑な返しのせいで、現状のScalazで可能なのかと勘違い)
  • Function型のfとgがあった場合、f == gができてしまってはまずいよね?
    • そうだよFunction型を"reference equality"(Scalaだとeqメソッド)で比べるべきじゃないし、比較するならdomainとcodomainを(ry
  • *1現状のScalazだけじゃできないよ、shapeless-contrib必要だよ、たとえばこんな感じになるよ、と言って例を示す

まだ議論続いてるようなので、詳しい言及というか感想は(気が向いたら)後で書きますが、ScalaTestの作者の人が、思いの他ScalazのEqualを理解してなかったことが残念・・・。
「ScalazのEqualは理解してるけど、毎回それぞれEqualのインスタンス定義面倒だから、妥協案としてScalaUtils内で似たようなものを作ったよ!」とかだったらまだよかった(?)のだけど、ScalazのEqualの利点、欠点を理解せずに、似たようなもの(似てるだけで実は異なるもの)を再発明するのはちょっとェ・・・(´・ω・`)となった。



なぜScalazのEqualとScalaUtilsを比べた場合に「似てるだけで実は異なるもの」なのか?を後で気が向いたら書く・・・

*1:以前typeclasssのインスタンスを自動導出する記事を書いたlarsr_hさんがでてきて