(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

Reply via email to