I think I need to think this through.... On Thu, Jun 14, 2012 at 12:28 PM, Ivan Lazar Miljenovic <ivan.miljeno...@gmail.com> wrote: > On 14 June 2012 14:20, Magicloud Magiclouds > <magicloud.magiclo...@gmail.com> wrote: >> OK. I think I understand a little. >> I use Job here just wants to simplify the code. And since I provide >> the function as library, I cannot decide what exact type k is. What >> should I do? > > Do you know what the type of `a'? If so: > > type Job k = Map k String > > Otherwise... do you even need a type alias? > >> >> On Thu, Jun 14, 2012 at 11:23 AM, Arlen Cuss <a...@len.me> wrote: >>> (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 >> >> >> >> -- >> 竹密岂妨流水过 >> 山高哪阻野云飞 >> >> And for G+, please use magiclouds#gmail.com. >> >> _______________________________________________ >> Haskell-Cafe mailing list >> Haskell-Cafe@haskell.org >> http://www.haskell.org/mailman/listinfo/haskell-cafe > > > > -- > Ivan Lazar Miljenovic > ivan.miljeno...@gmail.com > http://IvanMiljenovic.wordpress.com
-- 竹密岂妨流水过 山高哪阻野云飞 And for G+, please use magiclouds#gmail.com. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe