Arlen Cuss | 14 Jun 2012 05:23
Gravatar

Re: What extension do I need to write "type Job = Map k a"?

(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'".
(Continue reading)

Magicloud Magiclouds | 14 Jun 2012 06:20
Picon

Re: What extension do I need to write "type Job = Map k a"?

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?

On Thu, Jun 14, 2012 at 11:23 AM, Arlen Cuss <ar <at> 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,
(Continue reading)

Ivan Lazar Miljenovic | 14 Jun 2012 06:28
Picon
Gravatar

Re: What extension do I need to write "type Job = Map k a"?

On 14 June 2012 14:20, Magicloud Magiclouds
<magicloud.magiclouds <at> 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 <ar <at> 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.
(Continue reading)

Magicloud Magiclouds | 14 Jun 2012 07:24
Picon

Re: What extension do I need to write "type Job = Map k a"?

I think I need to think this through....

On Thu, Jun 14, 2012 at 12:28 PM, Ivan Lazar Miljenovic
<ivan.miljenovic <at> gmail.com> wrote:
> On 14 June 2012 14:20, Magicloud Magiclouds
> <magicloud.magiclouds <at> 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 <ar <at> 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.
>>>
(Continue reading)

Magicloud Magiclouds | 14 Jun 2012 09:19
Picon

Re: What extension do I need to write "type Job = Map k a"?

OK. I am totally confused here. Why "Couldn't match expected type
`Jobs k e a' with actual type `M.Map k0 b0'"....

 9|data JobInfo a e = (Exception e) =>
10|                   JobInfo { jobId :: ThreadId
11|                           , result :: MVar (Either e a) }
12|
13|type Jobs k e a = (Ord k, Exception e) =>
14|                  M.Map k (JobInfo e a)
15|
16|type JobArgs k a = (Ord k) =>
17|                   M.Map k a
21|
22|start :: (Ord k, Exception e) => JobArgs k a -> (a -> IO b) -> IO
(Jobs k e a)
23|start args worker = do
24|  arg <- newEmptyMVar
25|  Map.mapM (\a -> do
26|             putMVar arg a
27|             result <- newEmptyMVar
28|             tId <- forkIO $ do
29|               arg_ <- takeMVar arg
30|               result_ <- try $ worker arg_
31|               putMVar result result_
32|             return $ JobInfo tId result
33|           ) args

On Thu, Jun 14, 2012 at 1:24 PM, Magicloud Magiclouds
<magicloud.magiclouds <at> gmail.com> wrote:
> I think I need to think this through....
(Continue reading)

Magicloud Magiclouds | 14 Jun 2012 09:30
Picon

Re: What extension do I need to write "type Job = Map k a"?

Sorry, the last 'a' of line 22 is 'b'.

On Thu, Jun 14, 2012 at 3:19 PM, Magicloud Magiclouds
<magicloud.magiclouds <at> gmail.com> wrote:
> OK. I am totally confused here. Why "Couldn't match expected type
> `Jobs k e a' with actual type `M.Map k0 b0'"....
>
>  9|data JobInfo a e = (Exception e) =>
> 10|                   JobInfo { jobId :: ThreadId
> 11|                           , result :: MVar (Either e a) }
> 12|
> 13|type Jobs k e a = (Ord k, Exception e) =>
> 14|                  M.Map k (JobInfo e a)
> 15|
> 16|type JobArgs k a = (Ord k) =>
> 17|                   M.Map k a
> 21|
> 22|start :: (Ord k, Exception e) => JobArgs k a -> (a -> IO b) -> IO
> (Jobs k e a)
> 23|start args worker = do
> 24|  arg <- newEmptyMVar
> 25|  Map.mapM (\a -> do
> 26|             putMVar arg a
> 27|             result <- newEmptyMVar
> 28|             tId <- forkIO $ do
> 29|               arg_ <- takeMVar arg
> 30|               result_ <- try $ worker arg_
> 31|               putMVar result result_
> 32|             return $ JobInfo tId result
> 33|           ) args
(Continue reading)

Magicloud Magiclouds | 14 Jun 2012 09:33
Picon

Re: What extension do I need to write "type Job = Map k a"?

And line 14, should be JobInfo a e.
I must be too sleepy....

On Thu, Jun 14, 2012 at 3:30 PM, Magicloud Magiclouds
<magicloud.magiclouds <at> gmail.com> wrote:
> Sorry, the last 'a' of line 22 is 'b'.
>
> On Thu, Jun 14, 2012 at 3:19 PM, Magicloud Magiclouds
> <magicloud.magiclouds <at> gmail.com> wrote:
>> OK. I am totally confused here. Why "Couldn't match expected type
>> `Jobs k e a' with actual type `M.Map k0 b0'"....
>>
>>  9|data JobInfo a e = (Exception e) =>
>> 10|                   JobInfo { jobId :: ThreadId
>> 11|                           , result :: MVar (Either e a) }
>> 12|
>> 13|type Jobs k e a = (Ord k, Exception e) =>
>> 14|                  M.Map k (JobInfo e a)
>> 15|
>> 16|type JobArgs k a = (Ord k) =>
>> 17|                   M.Map k a
>> 21|
>> 22|start :: (Ord k, Exception e) => JobArgs k a -> (a -> IO b) -> IO
>> (Jobs k e a)
>> 23|start args worker = do
>> 24|  arg <- newEmptyMVar
>> 25|  Map.mapM (\a -> do
>> 26|             putMVar arg a
>> 27|             result <- newEmptyMVar
>> 28|             tId <- forkIO $ do
(Continue reading)

Arlen Cuss | 15 Jun 2012 01:09
Gravatar

Re: What extension do I need to write "type Job = Map k a"?

Hi Magicloud,

The indentation has been lost in the mail. Could you post your code (preferably without line numbers) on
hpaste.org or similar?

—A  

On Thursday, 14 June 2012 at 5:33 PM, Magicloud Magiclouds wrote:

> And line 14, should be JobInfo a e.
> I must be too sleepy....
>  
> On Thu, Jun 14, 2012 at 3:30 PM, Magicloud Magiclouds
> <magicloud.magiclouds <at> gmail.com (mailto:magicloud.magiclouds <at> gmail.com)> wrote:
> > Sorry, the last 'a' of line 22 is 'b'.
> >  
> > On Thu, Jun 14, 2012 at 3:19 PM, Magicloud Magiclouds
> > <magicloud.magiclouds <at> gmail.com (mailto:magicloud.magiclouds <at> gmail.com)> wrote:
> > > OK. I am totally confused here. Why "Couldn't match expected type
> > > `Jobs k e a' with actual type `M.Map k0 b0'"....
> > >  
> > > 9|data JobInfo a e = (Exception e) =>
> > > 10| JobInfo { jobId :: ThreadId
> > > 11| , result :: MVar (Either e a) }
> > > 12|
> > > 13|type Jobs k e a = (Ord k, Exception e) =>
> > > 14| M.Map k (JobInfo e a)
> > > 15|
> > > 16|type JobArgs k a = (Ord k) =>
> > > 17| M.Map k a
(Continue reading)

Magicloud Magiclouds | 15 Jun 2012 03:15
Picon

Re: What extension do I need to write "type Job = Map k a"?

Sorry, the full code is here:
http://hpaste.org/69972

On Fri, Jun 15, 2012 at 7:09 AM, Arlen Cuss <ar <at> len.me> wrote:
> Hi Magicloud,
>
> The indentation has been lost in the mail. Could you post your code (preferably without line numbers) on
hpaste.org or similar?
>
> —A
>
>
> On Thursday, 14 June 2012 at 5:33 PM, Magicloud Magiclouds wrote:
>
>> And line 14, should be JobInfo a e.
>> I must be too sleepy....
>>
>> On Thu, Jun 14, 2012 at 3:30 PM, Magicloud Magiclouds
>> <magicloud.magiclouds <at> gmail.com (mailto:magicloud.magiclouds <at> gmail.com)> wrote:
>> > Sorry, the last 'a' of line 22 is 'b'.
>> >
>> > On Thu, Jun 14, 2012 at 3:19 PM, Magicloud Magiclouds
>> > <magicloud.magiclouds <at> gmail.com (mailto:magicloud.magiclouds <at> gmail.com)> wrote:
>> > > OK. I am totally confused here. Why "Couldn't match expected type
>> > > `Jobs k e a' with actual type `M.Map k0 b0'"....
>> > >
>> > > 9|data JobInfo a e = (Exception e) =>
>> > > 10| JobInfo { jobId :: ThreadId
>> > > 11| , result :: MVar (Either e a) }
>> > > 12|
(Continue reading)


Gmane