(resending to café, turns out I wasn't subbed from this address.) Hi Magicloud, This is correct; because you've hidden the type-variables away by universally quantifying them, there's no more level of specificity you can get back *out* of them than just "some kind of Map" (Job = M.Map k b, where k ≠ k0, b ≠ b0).
If you have a Job type which can store *any* kind of Map (forall k a. Job (Map k a)), then that means you could have a Job with a Map Int Bool, and a Job with a Map String (Float -> Float), and they'd both have the same type "Job". You can't do anything with the values within, because you're being too permissive about what a Job is. You may want "data Job k a = Job (Map k a)", *or* if you do actually use one kind of Map only, then why not "data Job = Job (Map Int String)" (substituting your real types for Int and String). In this case, you could also consider using newtype ("newtype Job = Job { getJob :: Map Int String }") to provide the guarantee that you're getting a Job (and not any Map Int String) without performance loss. Let me know if I've been more confusing than helpful; Arlen On Thursday, 14 June 2012 at 1:16 PM, Magicloud Magiclouds wrote: > Hi there, > Thanks for the reply. To be clear, all I want is to "avoid having to > type type variables all over the place". What should I do? My original > code with RankNTypes and ImpredicativeTypes does not work.... > > The "type Job = forall k a. M.Map k a" works now. But function uses > it does not. Compiler complains about "Couldn't match expected type > `Job' with actual type `M.Map k0 b0'". > > On Wed, Jun 13, 2012 at 9:15 PM, Daniel Peebles <pumpkin...@gmail.com > (mailto:pumpkin...@gmail.com)> wrote: > That doesn't require existential quantification, but it'll need Rank-2 > typesif you ever do anything with Job. Unfortunately, a universally > quantifiedJob like what you wrote (or what Magicloud seems to want) is only > inhabitedby the empty Map. > > > An existentially quantified Job, as you might get with > > > data Job = forall k a. Job (Map k a) > > > does let you wrap up any Map containing anything in it, but unfortunatelythe > only thing you can do with that map afterwards is ask for > "structural"properties about it, like whether it's empty or how many elements > it has init. You could ask to enumerate the elements in it, but you wouldn't > be ableto touch any of them because you wouldn't know what their types were. > > > So I'm not really sure how to interpret the question. Was the goal to have > aheterogeneous Map, maybe? Or just to avoid having to type type variables > allover the place? Both of those are possible but require a bit > moresophistication with types. > > > -Dan > > > > > On Wed, Jun 13, 2012 at 7:32 AM, Ismael Figueroa Palet<ifiguer...@gmail.com > (mailto:ifiguer...@gmail.com)> wrote: > > > > Do you want to hide the specific types of the job? Presumably to thendefine a > type JobList = [Job] ?You can do that with the ExistentialQuantification > extension. > > > > type Job = forall k a. Map k atype JobList = [Job] > > > > ??Note you can't unpack the types k a once you have hidden them. But > thetypechecker can use it to ensure some static property.Also you could use > unsafeCoerce to do some casts, but *only if you are*sure* that things will go > OK*. > > > > > > > 2012/6/13 Magicloud Magiclouds <magicloud.magiclo...@gmail.com > (mailto:magicloud.magiclo...@gmail.com)> > > > > > Hi,I've forgotten this.This is OK:type Job k a = Map k aAnd this is OK:{-# > LANGUAGE RankNTypes #-} -- or LiberalTypeSynonyms?type Job = forall a. forall > k. Map k a > > > > > Then how to write it like this?type Job = Map k a--竹密岂妨流水过山高哪阻野云飞 > > > > > And for G+, please use magiclouds#gmail.com (http://gmail.com). > > > > > _______________________________________________Haskell-Cafe mailing > listhaskell-c...@haskell.org (mailto:Haskell-Cafe@haskell.org) > > > > http://www.haskell.org/mailman/listinfo/haskell-cafe > > > > > > > > > > > > > > > > > > > > > > > > > --Ismael > > > > > > > _______________________________________________Haskell-Cafe mailing > listhaskell-c...@haskell.org (mailto:Haskell-Cafe@haskell.org) > > > http://www.haskell.org/mailman/listinfo/haskell-cafe > > > > > > > > > > -- > 竹密岂妨流水过 > 山高哪阻野云飞 > > And for G+, please use magiclouds#gmail.com (http://gmail.com). > > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org (mailto:Haskell-Cafe@haskell.org) > http://www.haskell.org/mailman/listinfo/haskell-cafe _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe