
Maybe a is the Monoid: instance Monoid a => Monoid (Maybe a) -- Defined in ‘GHC.Base’ so I can compare its values with empty value: mempty == Nothing => True But if I try: mempty == Just 4 I get: <interactive>:1:1: error: • Ambiguous type variable ‘a0’ arising from a use of ‘mempty’ prevents the constraint ‘(Monoid a0)’ from being solved. Probable fix: use a type annotation to specify what ‘a0’ should be. These potential instances exist: instance Monoid a => Monoid (IO a) -- Defined in ‘GHC.Base’ instance Monoid Ordering -- Defined in ‘GHC.Base’ instance Monoid a => Monoid (Maybe a) -- Defined in ‘GHC.Base’ ...plus 7 others (use -fprint-potential-instances to see them all) • In the first argument of ‘(==)’, namely ‘mempty’ In the expression: mempty == Just 4 In an equation for ‘it’: it = mempty == Just 4 OK, I try: mempty::Maybe Int and get: <interactive>:1:1: error: • No instance for (Monoid Int) arising from a use of ‘mempty’ • In the expression: mempty :: Maybe Int In an equation for ‘it’: it = mempty :: Maybe Int so, how is related Int to Monoid, why does ghc expect from mempty::Maybe Int, Int to be Monoid?! As I understand, this means only that I mean "mempty" from (Maybe Int) type, which is Monoid and exists sure. Interesting is, that: mempty::Maybe [Int] => Nothing but how is related "monoidality" of "Maybe a" with "monoidality of "a" ??? Initial idea was to make comparison: mempty :: Maybe Int == Just 4 => False /Best regards, Paul