Zip + Functor = Apply

また細かいtypeclassの話で、それほど重要じゃないけどメモ。


「ZipとUnzipのtypeclassにlawないけど、"Zip + Functor"とか"Zip + Functor + Unzip"なら、law作れるんじゃないの?」
「"Zip + Functor"って単にApplyと同じでは?」

https://github.com/scalaz/scalaz/issues/278#issuecomment-20230322

なるほど、そういえばそうか・・・。つまり現状ApplyはZipを継承してないけど、継承していてもいいということに?
https://github.com/xuwei-k/scalaz/commit/49509a0f09586d88d43

ただ、以下のようなメソッドあるので
https://github.com/scalaz/scalaz/blob/v7.0.1/core/src/main/scala/scalaz/Zip.scala#L44-L50
https://github.com/scalaz/scalaz/blob/v7.0.1/core/src/main/scala/scalaz/Apply.scala#L37-L42
実用上別に継承してなくても、ほとんど困らない。

ただ、「ApplyのインスタンスだったらZipは自動で導出できる」わけで、"def ap"と"def zip"を両方実装してる分、ちょっとだけ実装の手間が増えてるというか重複してるくらい。


ところで、現状Scalazにおいて、Zipのインスタンスになってるものは、すべてApplyのインスタンスにもなっているみたい。つまりそれなら「Zipのtypeclassが必ずしも必要ない」ということになってしまうけど、なにか「Zipにはなるけど、Applyにはならない」例ないかな・・・