[Haskell-beginners] question on typeclasses and applicatives

Alec Benzer alecbenzer at gmail.com
Thu Sep 2 16:06:45 EDT 2010


On Thu, Sep 2, 2010 at 3:19 PM, Daniel Fischer <daniel.is.fischer at web.de> wrote:
>
> 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.
>


More information about the Beginners mailing list