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

mnTestEmMonoid IntmnLawEmを満たしていることをテストしています。