
On Thursday 02 September 2010 21:02:33, Alec Benzer wrote:
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?
Because the language specification imposed that instance declarations must have the form instance Class (T a1 a2 ... an) where ... where T is a type constructor, 0 <= n and a1, a2, ..., an are *distinct* type variables.
Is it potentially dangerous in some way?
I know of no dangers off the top of my head.
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)]
That's because you really get fromList [("double seven", (*2) 7),("double seven", (*2) 2), ("double two", (*2) 7), ("double two", (*2) 2)] and later values for the same key overwrite earlier. You probably wanted fs <*> xs = M.fromList [(k1 ++ " " ++ k2, v1 v2) | (k1,v1) <- M.assocs fs, (k2,v2) <- M.assocs xs]
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.