Monoidインスタンスがモノイドである条件について
今回注視すべきは単位元律…つまりmnLawEmです。
-- 単位元律
mnLawEm :: (Monoid a, Eq a) => a -> Bool
mnLawEm x =
let left = mempty `mappend` x
right = x `mappend` mempty
in left == right && right == x
少々コード化すると見難くなっていますが、Wikipediaから引用すると以下のことを表しています。
単位元律 S の元 e が存在して、S の任意の元 a に対して e • a = a • e = a
実はこのWikipedia中のeは、memptyと同一です。
mnLawEmは、例えばa = 3に対して以下になることを表しています。
mempty * 3 = 3 * mempty = 3
↓
1 * 3 = 3 * 1 = 3
mnTestEmはMonoid IntがmnLawEmを満たしていることをテストしています。