"似たような何か"って酷いですが、なんて呼べばいいんでしょうか?
ScalaUtilsという、ScalaTest作者が作ってるライブラリの中に、似たよう何かがあるわけですが、それを一言でいう場合、"Equality"ですか、"Equivalence"ですか、"TypeCheckedTripleEquals"ですか?
まぁそれの話です。
少し前の rpscala でこれの話題になったのですが
http://blog.pab-tech.net/2013/10/25/rpscala.html
周回遅れで(?)、twitter上で本人が議論してたのでまとめました
流れとしては
- 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を比べた場合に「似てるだけで実は異なるもの」なのか?を後で気が向いたら書く・・・