
On Thu, Sep 2, 2010 at 3:19 PM, Daniel Fischer
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
I guess I meant why does the language specification impose this?
instance Class (T a1 a2 ... an) where ...
where T is a type constructor, 0 <= n and a1, a2, ..., an are *distinct* type variables.
I don't understand, what you you mean by distinct? Like how is String not a distinct type variable by itself?
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]
Oh, ya, that's what I meant. Didn't think that list comprehension through.
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.