
In ghci there are type defaulting rules. When you go mempty == Nothing, it type defaults it to "Maybe ()". But when you type Just 4, 4 is definitely not (), and so it looks at the Monoid instance for the a default type to use in cases of numeric literals, the first of which is Int. Which brings you to the next problem. Maybe Int is only a Monoid if Int is an instance of Monoid, and Int is definitely not. That's because is 3 `mappend` 3 == 6 via addition? Or should it be 9 via multiplication? Or something else? What should mempty be, 0? Or maybe 1? Who is to decide what the only way of combining Ints together is. It turns out there are instances for both of those cases, but you have to wrap the int into a type so that it knows which way you want it to be interpreted. import Data.Monoid mempty == Just (Product 1)
false mempty == Just (Sum 1) false
There are similar monoidal instances for Bool, such as Any and All.
On Wed, Jun 7, 2017 at 12:33 PM, Baa
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 _______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners