Sorry, the last 'a' of line 22 is 'b'. On Thu, Jun 14, 2012 at 3:19 PM, Magicloud Magiclouds <magicloud.magiclo...@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 > > 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.
-- 竹密岂妨流水过 山高哪阻野云飞 And for G+, please use magiclouds#gmail.com. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe