deriving Eq について (2015-12-30 『ふつうのHaskellプログラミング』 もくもく読書会(第9章)の振り返り)
前回の第9章で下記の疑問が生じた
例(本より):
data Anchor = A String String deriving Eq
class宣言の記述で、Eqクラスのインスタンスの場合、(==)か(/=)のどちらかを実装しないと無限ループに陥るとあったが、Anchorの例でどちらも実装しないでも問題ないのはなぜ?
→ 実際に実行して試してみたが問題なかった。
anchor1 = A "http://se-info-tech.connpass.com/" "Homepage" anchor2 = A "http://se-info-tech.connpass.com/" "Homepage" anchor3 = A "http://se-info-tech.connpass.com/" "Home Page"
上記を読み込み下記をGHCiで実行
> anchor1 == anchor2 True > anchor1 == anchor3 False
これは本にも前回のコメントにもあるように自動でクラスメソッドが実装されているからなのだが、 そもそも引数が既に実装されたEqクラスのインスタンスであるStringであることを失念していたため、 下記の
instance Eq Anchor where (A u l) == (A u' l') =(u == u') && (l == l')
は(u == u')
や(l == l')
で無限ループになるのでは?と思っていた。
ただコンストラクタの引数がStringで既にEqのクラスメソッドが実装されていると考えると 自動で実装されても問題ないのだろう。
では、コンストラクタの引数がないEqクラスのインスタンスを宣言した場合、どうなるのかが気になってみた。
そこでコンストラクタ引数なしの下記を宣言して読み込んで
data TestEq = T deriving Eq test1 :: TestEq test1 = T test2 :: TestEq test2 = T
GHCiで実行してみた。
> test1 == test2 True > test1 == test1 True
どうやら問題ないようだ。