SE情報技術研究会’s blog

http://se-info-tech.connpass.com

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

どうやら問題ないようだ。