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.magiclo...@gmail.com> wrote:
> 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.



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

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

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to