[Haskell-cafe] What extension do I need to write "type Job = Map k a"?

Magicloud Magiclouds magicloud.magiclouds at gmail.com
Thu Jun 14 05:16:42 CEST 2012


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 <pumpkingod at gmail.com> wrote:
> That doesn't require existential quantification, but it'll need Rank-2 types
> if you ever do anything with Job. Unfortunately, a universally quantified
> Job like what you wrote (or what Magicloud seems to want) is only inhabited
> by 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 unfortunately
> the 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 in
> it. You could ask to enumerate the elements in it, but you wouldn't be able
> to 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 a
> heterogeneous Map, maybe? Or just to avoid having to type type variables all
> over the place? Both of those are possible but require a bit more
> sophistication with types.
>
> -Dan
>
>
> On Wed, Jun 13, 2012 at 7:32 AM, Ismael Figueroa Palet
> <ifigueroap at gmail.com> wrote:
>>
>> Do you want to hide the specific types of the job? Presumably to then
>> define a type JobList = [Job] ?
>> You can do that with the ExistentialQuantification extension.
>>
>> type Job = forall k a. Map k a
>> type JobList = [Job]
>>
>> ??
>> Note you can't unpack the types k a once you have hidden them. But the
>> typechecker 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.magiclouds at gmail.com>
>>>
>>> Hi,
>>>  I've forgotten this.
>>>  This is OK:
>>> type Job k a = Map k a
>>>  And 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.
>>>
>>> _______________________________________________
>>> Haskell-Cafe mailing list
>>> Haskell-Cafe at haskell.org
>>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>
>>
>>
>>
>> --
>> Ismael
>>
>>
>> _______________________________________________
>> Haskell-Cafe mailing list
>> Haskell-Cafe at haskell.org
>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>
>



-- 
竹密岂妨流水过
山高哪阻野云飞

And for G+, please use magiclouds#gmail.com.



More information about the Haskell-Cafe mailing list