
I came up with some code when trying to understand applicatives: import Control.Applicative import qualified Data.Map as M instance Applicative (M.Map String) where pure x = M.fromList [("",x)] fs <*> xs = M.fromList [(k1 ++ " " ++ k2,v1 v2) | k1 <- M.keys fs, k2 <- M.keys xs, v1 <- M.elems fs, v2 <- M.elems xs] 1. When I :load this in ghci it gives me some error about using (M.Map String) here, and tells me it'll work if I use the -XFlexibleInstances flag. Why is this type of behavior disabled by default? Is it potentially dangerous in some way? 2. When running the following: fromList [("double",(*2))] <*> fromList[("two",2),("seven",7)] I get: fromList [("double seven",4),("double two",4)] instead of what I'd expect: fromList [("double seven",14),("double two",4)] Although this: (*2) <$> fromList[("two",2),("seven",7)] gives what I'd expect: fromList [("seven",14),("two",4)] Why is this happening? I can't seem to figure it out.