Sorry, the full code is here: http://hpaste.org/69972
On Fri, Jun 15, 2012 at 7:09 AM, Arlen Cuss <a...@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.magiclo...@gmail.com (mailto:magicloud.magiclo...@gmail.com)> >> wrote: >> > Sorry, the last 'a' of line 22 is 'b'. >> > >> > On Thu, Jun 14, 2012 at 3:19 PM, Magicloud Magiclouds >> > <magicloud.magiclo...@gmail.com (mailto: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 (mailto: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 (mailto:ivan.miljeno...@gmail.com)> wrote: >> > > > > On 14 June 2012 14:20, Magicloud Magiclouds >> > > > > <magicloud.magiclo...@gmail.com >> > > > > (mailto: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 >> > > > > > (mailto: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 (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 >> > > > > >> > > > > >> > > > > >> > > > > >> > > > > >> > > > > -- >> > > > > Ivan Lazar Miljenovic >> > > > > ivan.miljeno...@gmail.com (mailto:ivan.miljeno...@gmail.com) >> > > > > http://IvanMiljenovic.wordpress.com >> > > > >> > > > >> > > > >> > > > >> > > > >> > > > -- >> > > > 竹密岂妨流水过 >> > > > 山高哪阻野云飞 >> > > > >> > > > And for G+, please use magiclouds#gmail.com (http://gmail.com). >> > > >> > > >> > > >> > > -- >> > > 竹密岂妨流水过 >> > > 山高哪阻野云飞 >> > > >> > > And for G+, please use magiclouds#gmail.com (http://gmail.com). >> > >> > >> > >> > -- >> > 竹密岂妨流水过 >> > 山高哪阻野云飞 >> > >> > And for G+, please use magiclouds#gmail.com (http://gmail.com). >> >> >> >> -- >> 竹密岂妨流水过 >> 山高哪阻野云飞 >> >> And for G+, please use magiclouds#gmail.com (http://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