Re: [Haskell-cafe] Haskell source AST zipper with state
On Thu, May 3, 2012 at 2:52 AM, Andrew Seniuk wrote: > Note that the "Annotated" version of the HSE parser/AST will probably > not provide enough > generality for the sorts of attributes you want to store (it's for > source locations, unless something changed in the most recent > release). > I do hope you're wrong on that! The annotations are fully general (and have been all along), so you can store whatever you like there(*). They are *used* for source locations by the parser, but that's just one possibility. Cheers, /Niklas (*) The only requirement is that you need to store values of the same type throughout the syntax tree - but Either or Maybe should do the trick there. ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Learn you
On 3/05/2012, at 5:18 AM, Brent Yorgey wrote: > I am curious how the title was translated. Of course, the English > title "Learn You a Haskell for Great Good" uses intentionally > ungrammatical/unidiomatic English for humorous effect. Is the > Japanese title also ungrammatical/unidiomatic Japanese? Or do > Japanese speakers not find that humorous? This native speaker of English doesn't find the effect of the English title funny, despite finding practically everything in the world, up to and including a bout of kidney stones, funny. Humour styles really don't travel all that well. The Little Lisper (and the other books like The Little Schemer and The Seasoned Schemer) are presumably meant to be funny, but to me come across as offensively patronising (you are such a drooling idiot that if we didn't have this heavy laugh track you'd go to sleep or something). Such a pity, because they are such great books if you can refrain from throwing them out the window every few minutes. Now if the Japanese title were *perfect* Japanese, that *would* be funny, because it would be a case of a good translation being a bad translation. I did say that humour doesn't travel well... ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] OpenGL: No instance for Random GLfloat
Hi, I tried this but now I get another error: The data constructors of `GLfloat' are not all in scope so you cannot derive an instance for it In the stand-alone deriving instance for `Random GLfloat' Mark On 03/05/2012, at 10:39 AM, Patrick Palka wrote: > Because GLfloat is simply a newtype wrapper for CFloat, which has a Random > instance, I would do: > > {-# LANGUAGE StandaloneDeriving #-} > {-# LANGUAGE GeneralizedNewtypeDeriving #-} > deriving instance Random GLFloat > > On Wed, May 2, 2012 at 6:29 PM, Mark Spezzano > wrote: > Hi Haskellers, > > I'm trying to generate a random vertex in OpenGL as follows. > > genPosition :: IO (Vertex3 GLfloat) > genPosition = do x <- getStdRandom $ randomR (-1.6,1.6) > y <- getStdRandom $ randomR (-1.0,1.0) > return (Vertex3 x y (-1)) > > Unfortunately the compiler complains about me having to implement an instance > of Random for GLfloat. > > How do I do this (or avoid having to do this)? > > Cheers, > > Mark > > > ___ > Haskell-Cafe mailing list > 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 ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Haskell Weekly News: Issue 225
Welcome to issue 225 of the HWN, an issue covering crowd-sourced bits of information about Haskell from around the web. This issue covers the week of April 22 to 28, 2012. Announcements Matthias Fischmann made a call for participation to the Hong Kong Haskell hackathon, with tentative dates of May 11-13 or 25-27. Follow to link for more information. [1] http://goo.gl/9sRLF HacPhi, the hackathon in Philadelphia, Pennsylvania, USA, will be held between August 3-5, 2012. [2] http://goo.gl/Rm2qH Quotes of the Week * lambdabot was last seen on #haskell 1 hour, 37 minutes and 46 seconds ago, saying: * elliott: oh, it's not haskell-cafe? that explains the reasonable responses ["it" = GHC mailing list] * Morandat: "The astute reader will have noticed that the above example clashes with our claim that R is lexically scoped. As is often the case, R is lexically scoped up to the point it is not." * quicksilver: lisp doesn't have equational reasoning so there is nothing to lose :) * JoeyA: One thing I like about Haskell versus C++ is that abusing language features tends to give more satisfying results. monochrom: that seems to be a criterion for drugs rather than languages :) Top Reddit Stories * Darcs 2.8: faster, better annotate; patch stash (obliterate -O); revert hunk split; and more! Domain: wiki.darcs.net, Score: 63, Comments: 21 On Reddit: [3] http://goo.gl/4tj4i Original: [4] http://goo.gl/R7TpP * The Haskell / Snap ecosystem is as productive (or more) than Ruby/Rails. Domain: blog.dbpatterson.com, Score: 63, Comments: 46 On Reddit: [5] http://goo.gl/cP3NC Original: [6] http://goo.gl/23alh * Cabal is now hosted on GitHub Domain: github.com, Score: 44, Comments: 20 On Reddit: [7] http://goo.gl/yBqCC Original: [8] http://goo.gl/0ze9y * Eight Haskell Google Summer of Code projects accepted Domain: google-melange.com, Score: 40, Comments: 25 On Reddit: [9] http://goo.gl/c2KXg Original: [10] http://goo.gl/vu681 * “Live” code update for Haskell Domain: self.haskell, Score: 31, Comments: 17 On Reddit: [11] http://goo.gl/ZZDb6 Original: [12] http://goo.gl/ZZDb6 * Functional Programming in C++ Domain: altdevblogaday.com, Score: 30, Comments: 12 On Reddit: [13] http://goo.gl/pFuHk Original: [14] http://goo.gl/aG6iP * Why do we not define IO as a Free monad? Domain: self.haskell, Score: 28, Comments: 47 On Reddit: [15] http://goo.gl/jiSdb Original: [16] http://goo.gl/jiSdb * Elm: Source code and Compiler/Server now available. Write FRP code for the web! Domain: self.haskell, Score: 27, Comments: 11 On Reddit: [17] http://goo.gl/9hE6X Original: [18] http://goo.gl/9hE6X * An experiment with Bayesian Networks in Haskell Domain: alpheccar.org, Score: 27, Comments: On Reddit: [19] http://goo.gl/21VDw Original: [20] http://goo.gl/2piKL * More Client Side Yesod: todo sample Domain: yesodweb.com, Score: 25, Comments: 10 On Reddit: [21] http://goo.gl/LGO75 Original: [22] http://goo.gl/QGsrZ * C Style Haskell Domain: kormacode.blogspot.com, Score: 24, Comments: 21 On Reddit: [23] http://goo.gl/VsShj Original: [24] http://goo.gl/o75jn Top StackOverflow Questions * Avoiding IORefs in pure code votes: 19, answers: 1 Read on SO: [25] http://goo.gl/327fO * How can I get JHC to cooperate with the android ndk? votes: 11, answers: 1 Read on SO: [26] http://goo.gl/oGMQ9 * Is there a name for this function or pattern? votes: 11, answers: 2 Read on SO: [27] http://goo.gl/HJixe * Haskell rank two polymorphism compile error votes: 11, answers: 2 Read on SO: [28] http://goo.gl/hYdRX * Python faster than compiled Haskell? votes: 11, answers: 5 Read on SO: [29] http://goo.gl/sUXMa * How does one release a *nix project? votes: 10, answers: 2 Read on SO: [30] http://goo.gl/JTgCz * Optimizing partial computation in Haskell votes: 8, answers: 1 Read on SO: [31] http://goo.gl/Dncn7 * Proper way to treat global flags in Haskell votes: 8, answers: 2 Read on SO: [32] http://goo.gl/di2Ld * Generating code for another language in Haskell votes: 7, answers: 1 Read on SO: [33] http://goo.gl/OlRCI * Why does haskell enumerator based IO call sigprocmask so often? votes: 7, answers: 4 Read on SO: [34] http://goo.gl/kfTSy * confused about function as instance of Functor in haskell votes: 7, answers: 5 Read on SO: [35] http://goo.gl/aX9JA Until next time, Daniel Santa Cruz References 1. http://permalink.gmane.org/gmane.comp.lang.haskell.cafe/98038 2. http://www.haskell.org/haskellwiki/Hac_%CF%86 3. http://wiki.darcs.net/Releases/2.8
Re: [Haskell-cafe] OpenGL: No instance for Random GLfloat
Because GLfloat is simply a newtype wrapper for CFloat, which has a Random instance, I would do: {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} deriving instance Random GLFloat On Wed, May 2, 2012 at 6:29 PM, Mark Spezzano wrote: > Hi Haskellers, > > I'm trying to generate a random vertex in OpenGL as follows. > > genPosition :: IO (Vertex3 GLfloat) > genPosition = do x <- getStdRandom $ randomR (-1.6,1.6) > y <- getStdRandom $ randomR (-1.0,1.0) > return (Vertex3 x y (-1)) > > Unfortunately the compiler complains about me having to implement an > instance of Random for GLfloat. > > How do I do this (or avoid having to do this)? > > Cheers, > > Mark > > > ___ > Haskell-Cafe mailing list > 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
Re: [Haskell-cafe] Haskell source AST zipper with state
On Wed, May 2, 2012 at 7:20 PM, Tony Morris wrote: > Is there a library to traverse a source AST keeping state? Hi Tony, I was able to do this [1] using haskell-src-exts and a state monad. AST traversal is possible due to HSE deriving instances for Data in all its datatype declarations, but the traversals were of a generic variety, rather than zippers. I read Scrap Your Zippers [2] and looked at various other generic zipper libs, but in the end I managed without zippers. Note that most zipper libs require instance declarations for all the syntax datatypes -- Scrap Your Zippers only requires the Data instances that HSE comes with, not sure why I was unable to use it, probably just inexperience. Note that the "Annotated" version of the HSE parser/AST will probably not provide enough generality for the sorts of attributes you want to store (it's for source locations, unless something changed in the most recent release). Best of luck, and I'll be interested to hear other responses! -Andrew [1] http://hackage.haskell.org/freesect (in particular FreeSect*.hs) [2] https://www.cs.indiana.edu/~adamsmd/papers/scrap_your_zippers/ ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] heterogeneous environment
thanks oleg and heinrich for the solutions; i'll definitely take a look at the vault package. i'll probably end up using unsafeCoerce though, it's too tempting (shame on me.) On May 2, 2012, at 2:33 AM, o...@okmij.org wrote: > It seems you actually prefer this solution, if it worked. This > solution will entail some run-time check one way or another, because > we `erase' types when we store them in the log and we have to recover > them later. actually i don't prefer this solution. i'm interested to hear if there are other solutions (or ways to avoid the problem entirely.) i don't know what to search for, something like interpreters with environments with heterogeneous types. i find the circuit-diagram / functional representation the most interesting, but it seems unfortunately syntactically impossible. best, ben ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Haskell source AST zipper with state
Is there a library to traverse a source AST keeping state? -- Tony Morris http://tmorris.net/ ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] OpenGL: No instance for Random GLfloat
Hi Haskellers, I'm trying to generate a random vertex in OpenGL as follows. genPosition :: IO (Vertex3 GLfloat) genPosition = do x <- getStdRandom $ randomR (-1.6,1.6) y <- getStdRandom $ randomR (-1.0,1.0) return (Vertex3 x y (-1)) Unfortunately the compiler complains about me having to implement an instance of Random for GLfloat. How do I do this (or avoid having to do this)? Cheers, Mark ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Edmonton Functional Programming Users Group (EFPUG)
Hi Cafe, If you live in the Edmonton, Canada area, and you're interested in functional programming, EFPUG is an informal discussion group you might find interesting. Most of our talks have been on Haskell topics, but we're interested in functional languages in general. Our Google Group is https://groups.google.com/forum/?fromgroups&hl=en#!forum/edmonton-functional-programming-users-group We meet on the first Tuesday of (almost) each month at the Computing Science building on the University of Alberta north campus. New participants, and new ideas for talks, hack nights, or other FP-related activities, are always welcome. Cheers, Kevin -- Kevin Charter kevin.char...@acm.org ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Threads and hGetLine
> There are two threads, one which is waits on input via > hGetLine > and another, which should terminate this thread or close this handle. like this? The trick is to fork the blocking call (hGetLine) and wait on an MVar. That way, the kill signal can be handled: {-# language PatternSignatures #-} import Control.Concurrent import Control.Concurrent.MVar import Control.Exception import System.IO main = do pid <- forkIO $ do s <- wawiter putStrLn s threadDelay $ 5 * 10^6 killThread pid waiter = do v <- newEmptyMVar forkIO $ do s <- hGetLine stdin ; putMVar v s readMVar v `Control.Exception.catch` \ (e :: AsyncException ) -> return "killed" PS: and I refuse to use the "ScopedTypeVariables" pragma since obviously there are no type variables. ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Learn you
2012/5/2 Felipe Almeida Lessa : > On Wed, May 2, 2012 at 2:41 PM, Wojciech Jedynak wrote: >> In formal grammar it should be "Sugoi Haskell tanoshiku WO manabou!" - >> this WO is a particle identifying the object and this omission is >> normal in colloquial, spoken Japanese. > > My basic Japanase is very rusty, but shouldn't that be "sugoi Haskell > wo tanoshiku manabou"? Not trying to find errors, just trying to > learn something myself =). You're right, of course :-) Wojciech ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Learn you
On Wed, May 2, 2012 at 2:02 PM, Bardur Arantsson wrote: > On 05/02/2012 07:37 PM, Brandon Allbery wrote: > >> The English title does require a little context for the humor: it >> leverages a chain of poor-translation memes going back (at least) to >> all-your-base. >> >> I always thought it was a nod to > > Borat: Cultural Learnings of America for Make Benefit Glorious Nation of > Kazakhstan > They're both doing the same thing, AYB came a bit earlier than Borat though. -- brandon s allbery allber...@gmail.com wandering unix systems administrator (available) (412) 475-9364 vm/sms ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Learn you
On Wed, May 2, 2012 at 2:41 PM, Wojciech Jedynak wrote: > In formal grammar it should be "Sugoi Haskell tanoshiku WO manabou!" - > this WO is a particle identifying the object and this omission is > normal in colloquial, spoken Japanese. My basic Japanase is very rusty, but shouldn't that be "sugoi Haskell wo tanoshiku manabou"? Not trying to find errors, just trying to learn something myself =). Cheers, -- Felipe. ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Learn you
On 05/02/2012 07:37 PM, Brandon Allbery wrote: On 2 May 2012 18:18, Brent Yorgey wrote: I am curious how the title was translated. Of course, the English title "Learn You a Haskell for Great Good" uses intentionally ungrammatical/unidiomatic English for humorous effect. Is the On Wed, May 2, 2012 at 1:25 PM, Colin Adamswrote: I don't find it (the English title) humorous. I just assumed it was written by a non-native English speaker. The English title does require a little context for the humor: it leverages a chain of poor-translation memes going back (at least) to all-your-base. I always thought it was a nod to Borat: Cultural Learnings of America for Make Benefit Glorious Nation of Kazakhstan Regards, ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Learn you
(caveat: I'm not a native speaker of Japanese) I think the Japanese title is in a similar spirit as the original one. Breaking it down: Sugoi Haskell tanoshiku manabou! sugoi - "awesome" (rather colloquial) tanoshiku - "while having fun" manabou - "let's learn" In formal grammar it should be "Sugoi Haskell tanoshiku WO manabou!" - this WO is a particle identifying the object and this omission is normal in colloquial, spoken Japanese. How does the Japanese title sound to native speakers? I'm curious myself :) Wojciech 2012/5/2 Brent Yorgey : > I am curious how the title was translated. Of course, the English > title "Learn You a Haskell for Great Good" uses intentionally > ungrammatical/unidiomatic English for humorous effect. Is the > Japanese title also ungrammatical/unidiomatic Japanese? Or do > Japanese speakers not find that humorous? > > -Brent > > On Wed, May 02, 2012 at 03:59:18PM +0900, Kazu Yamamoto wrote: >> Hello cafe, >> >> Translating "Learn You a Haskell for Great Good" into Japanese was >> finished and will be published on 22 May. I guess it's worth watching >> its cover page: >> >> >> http://www.amazon.co.jp/%E3%81%99%E3%81%94%E3%81%84Haskell%E3%81%9F%E3%81%AE%E3%81%97%E3%81%8F%E5%AD%A6%E3%81%BC%E3%81%86-Miran-Lipova%C4%8Da/dp/4274068854 >> >> There are two translators: Tanaka is the author of "peggy" and Muranushi is >> the author of "Monadius". >> >> Regards, >> >> --Kazu >> >> ___ >> Haskell-Cafe mailing list >> 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 ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Learn you
On 2 May 2012 18:18, Brent Yorgey wrote: > I am curious how the title was translated. Of course, the English > title "Learn You a Haskell for Great Good" uses intentionally > ungrammatical/unidiomatic English for humorous effect. Is the > On Wed, May 2, 2012 at 1:25 PM, Colin Adams wrote: > I don't find it (the English title) humorous. I just assumed it was > written by a non-native English speaker. > The English title does require a little context for the humor: it leverages a chain of poor-translation memes going back (at least) to all-your-base. -- brandon s allbery allber...@gmail.com wandering unix systems administrator (available) (412) 475-9364 vm/sms ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Learn you
I don't find it (the English title) humorous. I just assumed it was written by a non-native English speaker. On 2 May 2012 18:18, Brent Yorgey wrote: > I am curious how the title was translated. Of course, the English > title "Learn You a Haskell for Great Good" uses intentionally > ungrammatical/unidiomatic English for humorous effect. Is the > Japanese title also ungrammatical/unidiomatic Japanese? Or do > Japanese speakers not find that humorous? > > -Brent > > On Wed, May 02, 2012 at 03:59:18PM +0900, Kazu Yamamoto wrote: > > Hello cafe, > > > > Translating "Learn You a Haskell for Great Good" into Japanese was > > finished and will be published on 22 May. I guess it's worth watching > > its cover page: > > > > > http://www.amazon.co.jp/%E3%81%99%E3%81%94%E3%81%84Haskell%E3%81%9F%E3%81%AE%E3%81%97%E3%81%8F%E5%AD%A6%E3%81%BC%E3%81%86-Miran-Lipova%C4%8Da/dp/4274068854 > > > > There are two translators: Tanaka is the author of "peggy" and Muranushi > is > > the author of "Monadius". > > > > Regards, > > > > --Kazu > > > > ___ > > Haskell-Cafe mailing list > > 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 > ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Learn you
I am curious how the title was translated. Of course, the English title "Learn You a Haskell for Great Good" uses intentionally ungrammatical/unidiomatic English for humorous effect. Is the Japanese title also ungrammatical/unidiomatic Japanese? Or do Japanese speakers not find that humorous? -Brent On Wed, May 02, 2012 at 03:59:18PM +0900, Kazu Yamamoto wrote: > Hello cafe, > > Translating "Learn You a Haskell for Great Good" into Japanese was > finished and will be published on 22 May. I guess it's worth watching > its cover page: > > > http://www.amazon.co.jp/%E3%81%99%E3%81%94%E3%81%84Haskell%E3%81%9F%E3%81%AE%E3%81%97%E3%81%8F%E5%AD%A6%E3%81%BC%E3%81%86-Miran-Lipova%C4%8Da/dp/4274068854 > > There are two translators: Tanaka is the author of "peggy" and Muranushi is > the author of "Monadius". > > Regards, > > --Kazu > > ___ > Haskell-Cafe mailing list > 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
[Haskell-cafe] ANN: HacPhi 2012
Greetings, I am very pleased to officially announce Hac Phi 2012, a Haskell hackathon/get-together to be held August 3-5 at the University of Pennsylvania in Philadelphia. The hackathon will officially kick off at 2:30 Friday afternoon, and go until 5pm on Sunday (with breaks for sleep, of course). Last year's Hac Phi was a lot of fun, drawing more than 30 Haskellers, and many people have already expressed interest in coming back this year. Come meet your Haskelly comrades-in-arms! I want to stress that everyone is welcome - you do not have to be a Haskell guru. Helping hack on someone else's project could be a great way to increase your Haskell-fu. If you plan on coming, please officially register [1]. Registration, travel, lodging and many other details can be found on the Hac Phi wiki [2]. This year, we are making a public list of attendees' names and nicks - please let us know if you'd prefer not to be listed when you register. We're also looking for a few people interested in giving short (15-20 min.) talks, probably on Saturday afternoon. Anything of interest to the Haskell community is fair game - a project you've been working on, a paper, a quick tutorial. If you'd like to give a talk, add it on the wiki [3]. Hac Phi 2012 is supported by contributions from Amgen and Jane Street. Hope to see you in Philadelphia! - The Hac Phi team Brent Yorgey (byorgey) Daniel Wagner (dmwit) Chris Casinghino (ccasin) [1] http://www.haskell.org/haskellwiki/Hac_%CF%86/Register [2] http://www.haskell.org/haskellwiki/Hac_%CF%86 [3] http://www.haskell.org/haskellwiki/Hac_%CF%86/Talks ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Arithmetic expressions with GADTs: parsing
Hi Romildo, On Wed, May 2, 2012 at 3:08 PM, j.romildo wrote: > You are right in the sense that I cannot mix Expr Bool and Expr Double > in a (O op l r) expression. > > But the parser should be able to parse any form of expressions. So I > rewrite my program to take this into account. > > The new versions still does not compile: > > Expr.hs:27:23: > Couldn't match expected type `Double' with actual type `Bool' > Expected type: ParsecT > String () Data.Functor.Identity.Identity (Expr Double) > Actual type: ParsecT > String () Data.Functor.Identity.Identity (Expr Bool) >In the first argument of `(<|>)', namely `pBool' >In the second argument of `(<|>)', namely `pBool <|> pEqual' > You appear to still be having the same problem. Perhaps this because you don't quite understand the type error? Let me help you dissect it. Since this is a type error, I'm not going to assume anything about what should or should not work. I'll only look at the types. First, let's comment out the offending line, so that your file type-checks: Line 27: -- pExpr = pArit <|> pBool <|> pEqual Next, let's look at each of the components relevant to the type error. The first mentioned is (<|>). In GHCi, we can find out more information about that: *Expr> :i (<|>) (<|>) :: ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a -- Defined in Text.Parsec.Prim infixr 1 <|> >From this, we see that the same type parameters to ParsecT are used in the two argument types as well as the result type. We also see that (<|>) is a right-associative infix operator. So, this means the offending line could be parenthesized as pArit <|> (pBool <|> pEqual), which fits the second part of the type error, pBool <|> pEqual. Looking at the types of those, we see: *Expr> :t pBool pBool :: ParsecT String () Data.Functor.Identity.Identity (Expr Bool) *Expr> :t pEqual pEqual :: ParsecT String () Data.Functor.Identity.Identity (Expr Double) As we saw with the type of (<|>), these two types should be the "same" (as in unifiable). However, they are not, because the two type arguments to the Expr GADT differ: Bool in one case and Double in the other. GHC cannot "match" (unify) these types. Now, to the goal of your project: You say that the parser "should be able to parse any form of expressions," but since you are using a GADT with the expected expression types in the result index of each constructor, you can only define parsers that each parse an expression of a single type. That is, you can have a parser for Expr Bool and a parser for Expr Double, but these parsers can not be alternatives of another Expr and still have a valid type. This is, of course, the reason for using the type index as it is: you don't want Bool where you expect Double and vice versa. As a general comment, you may want to consider simplifying your goal to parsing only expressions of type Double. Then, what happens to your Bool constructors? Well, you could drop them, or you could extend your GADT with an "if" constructor that takes a boolean condition with Double alternatives. Regards, Sean ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] heterogeneous environment
Ben wrote: while working on an STM-like library, i ran into the issue of trying to create a transaction log for reads / writes of heterogeneous reference types. i don't have a good answer to this problem. the problem is twofold : first, the general heterogeneous collection problem, and second, connecting a reference to its log. I've had similar problems while implementing my reactive-banana library. The solution is described here http://apfelmus.nfshost.com/blog/2011/09/04-vault.html and also available as a cabal package http://hackage.haskell.org/package/vault Note that the Vault data type is probably not quite what you are looking for as it represents a whole collection of references. But have a look at the type Data.Vault.Locker in the vault-0.2 package which I have just uploaded to hackage. Oleg's email describes essentially the same solution. Best regards, Heinrich Apfelmus -- http://apfelmus.nfshost.com ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Arithmetic expressions with GADTs: parsing
On Wed, May 02, 2012 at 03:02:46PM +0300, Roman Cheplyaka wrote: > * j.romi...@gmail.com [2012-05-02 08:03:45-0300] [...] > The alternatives given to <|> must be of the same type. In your case, > one is Expr Double and one is Expr Bool. > > Inclusion of pBool in pFactor is probably a mistake — unless you're > going to multiply booleans. You are right in the sense that I cannot mix Expr Bool and Expr Double in a (O op l r) expression. But the parser should be able to parse any form of expressions. So I rewrite my program to take this into account. The new versions still does not compile: Expr.hs:27:23: Couldn't match expected type `Double' with actual type `Bool' Expected type: ParsecT String () Data.Functor.Identity.Identity (Expr Double) Actual type: ParsecT String () Data.Functor.Identity.Identity (Expr Bool) In the first argument of `(<|>)', namely `pBool' In the second argument of `(<|>)', namely `pBool <|> pEqual' Romildo {-# LANGUAGE GADTs #-} {-# LANGUAGE StandaloneDeriving #-} module Expr where import Text.Parsec import Text.Parsec.String import Control.Applicative ((<$>),(<$),(<*),(*>)) import Data.Char data Op where Add :: Op Sub :: Op Mul :: Op Div :: Op deriving (Show) data Expr a where N :: Double -> Expr Double B :: Bool -> Expr Bool O :: Op -> Expr Double -> Expr Double -> Expr Double E :: Expr Double -> Expr Double -> Expr Bool deriving instance Show (Expr a) pExpr = pArit <|> pBool <|> pEqual pArit = chainl1 pTerm (O Add <$ pToken "+" <|> O Sub <$ pToken "-") pTerm = chainl1 pFactor (O Mul <$ pToken "*" <|> O Div <$ pToken "/") pFactor = N <$> pNum <|> between (pToken "(") (pToken ")") pArit pNum = read <$> pLexeme (many1 (satisfy isDigit)) pBool = (pToken "t" >> return (B True)) <|> (pToken "f" >> return (B False)) pEqual= E <$> pArit <* pToken "=" *> pArit pToken :: String -> Parser String pToken t = pLexeme (string t) pLexeme p = p <* many (satisfy isSpace) opf Add = (+) opf Sub = (-) opf Mul = (*) opf Div = (/) eval :: Expr a -> a eval (N n) = n eval (B b) = b eval (O op l r) = opf op (eval l) (eval r) eval (E l r)= eval l == eval r -- main = do line <- getLine -- case parse pExpr "" line of -- Left msg -> putStrLn (show msg) -- Right e -> putStrLn (eval e) ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Arithmetic expressions with GADTs: parsing
* j.romi...@gmail.com [2012-05-02 08:03:45-0300] > Hello. > > In order to learn GADTs, I have written the attached program, which > defines a type for arithmetic expressions using GADTs, a parser for > them, and an evaluation function. > > But my parser does not typecheck. ghc-7.4.1 gives me the error message: > > Expr.hs:25:28: > Couldn't match expected type `Double' with actual type `Bool' > Expected type: Bool -> Expr Double > Actual type: Bool -> Expr Bool > In the first argument of `(<$>)', namely `B' > In the first argument of `(<|>)', namely `B <$> pBool' > > Any clues on how to fix that? The alternatives given to <|> must be of the same type. In your case, one is Expr Double and one is Expr Bool. Inclusion of pBool in pFactor is probably a mistake — unless you're going to multiply booleans. -- Roman I. Cheplyaka :: http://ro-che.info/ ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Arithmetic expressions with GADTs: parsing
Hello. In order to learn GADTs, I have written the attached program, which defines a type for arithmetic expressions using GADTs, a parser for them, and an evaluation function. But my parser does not typecheck. ghc-7.4.1 gives me the error message: Expr.hs:25:28: Couldn't match expected type `Double' with actual type `Bool' Expected type: Bool -> Expr Double Actual type: Bool -> Expr Bool In the first argument of `(<$>)', namely `B' In the first argument of `(<|>)', namely `B <$> pBool' Any clues on how to fix that? Romildo {-# LANGUAGE GADTs #-} module Expr where import Text.Parsec import Text.Parsec.String import Control.Applicative ((<$>),(<$),(<*)) import Data.Char data Op where Add :: Op Sub :: Op Mul :: Op Div :: Op data Expr a where N :: Double -> Expr Double B :: Bool -> Expr Bool O :: Op -> Expr Double -> Expr Double -> Expr Double E :: Expr Double -> Expr Double -> Expr Bool pExpr = chainl1 pTerm (O Add <$ pToken "+" <|> O Sub <$ pToken "-") pTerm = chainl1 pFactor (O Mul <$ pToken "*" <|> O Div <$ pToken "/") pFactor = N <$> pNum <|> B <$> pBool <|> between (pToken "(") (pToken ")") pExpr pNum = read <$> pLexeme (many1 (satisfy isDigit)) pBool = (pToken "t" >> return (B True)) <|> (pToken "f" >> return (B False)) pToken :: String -> Parser String pToken t = pLexeme (string t) pLexeme p = p <* many (satisfy isSpace) opf Add = (+) opf Sub = (-) opf Mul = (*) opf Div = (/) eval :: Expr a -> a eval (N n) = n eval (B b) = b eval (O op l r) = opf op (eval l) (eval r) eval (E l r)= eval l == eval r main = do line <- getLine case parse pExpr "" line of Left msg -> putStrLn (show msg) Right e -> putStrLn (eval e) ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] heterogeneous environment
Ben wrote: > - use Data.Unique to identify Refs, and use existential quantification > or Data.Dynamic to create a heterogenous Map from uid to log. for > example, to represent a log of compare-and-swaps we might do something > like > data Ref a = Ref (IORef a) Unique > data OpaqueCAS = forall a . > OpaqueCAS { casRef :: Ref a, oldVal :: a, newVal :: a } > type CASLog = Map Unique OpaqueCAS > logCAS r@(Ref _ uid) o n log = insert uid (OpaqueCAS r o n) log... > but what if the transaction wants to perform a second CAS on a > reference we've already CAS'd? then we should create a combined > OpaqueCAS record which expects t he first oldVal and swaps in the > second newVal. unfortunately the type checker balks at this, as it > can't prove that the type variable 'a from the first record is the > same as the 'a in the new record; i suppose there might be some fancy > type shenanigans which might solve this... It seems you actually prefer this solution, if it worked. This solution will entail some run-time check one way or another, because we `erase' types when we store them in the log and we have to recover them later. If the problem is of merging two CASLog entries into one, your code above already solves it. There are no type shenanigans are necessary. I will make slight modification though by introducing an extra IORef for `ephemeral' communication. Values written to that IORef almost immediately retrieved. It is not strictly necessary since your Ref already has one IORef; I assume that it can't be garbled, even for a brief moment. The complete code is enclosed at the end of the message. If one wants to live a bit dangerously but efficiently, one may wish to create a module of reference cells indexed by unique numbers, like your Ref. The data constructor Ref is not exported. If the only way to create Refs is to use the function newRef of the module, and that function assuredly creates a Ref with a unique label, one is justified in writing the function cast :: Ref a -> Ref b -> Maybe (Ref b) cast r1@(Ref _ u1) (Ref _ u2) | u1 == u2 -> Just (unsafeCoerce r1) cast _ _ = Nothing because the same labels correspond to references of the same type. The _safe_ solution, similar to that in the enclosed code below, was used in HANSEI, which is the embedded DSL for probabilistic programming. Here is the relevant code describing first-class memory (it is OCaml). (* We often use mutable variables as `communication channel', to appease the type-checker. The variable stores the `option' value -- most of the time, None. One function writes a Some x value, and another function almost immediately reads the value -- exactly once. The protocol of using such a variable is a sequence of one write almost immediately followed by one read. We use the following helpers to access our `communication channel'. *) let from_option = function Some x -> x | None -> failwith "fromoption";; let read_answer r = let v = from_option !r in r := None; v (* for safety *) (* First-class storage: for the implementation of `thread-local' memory *) module Memory = struct type 'a loc = int * 'a option ref type cell = unit -> unit module M = Map.Make(struct type t = int let compare x y = x - y end) type mem = cell M.t let newm = M.empty let genid : unit -> int = (* generating fresh locations *) let counter = ref 0 in fun () -> let v = !counter in counter := succ v; v let new_loc () = (genid (), ref None) let new_cell (_,chan) x = fun () -> chan := Some x let mref (id,chan) m = let cell = M.find id m in cell (); read_answer chan let mset ((id,chan) as loc) x m = M.add id (new_cell loc x) m end;; Enclosed Haskell code: {-# LANGUAGE ExistentialQuantification #-} module Ref where import Data.IORef import Data.Unique import Data.Map as M data Ref a = Ref (IORef a) (IORef a) Unique data OpaqueCAS = forall a . OpaqueCAS { casRef :: Ref a, oldVal :: a, newVal :: a } type CASLog = M.Map Unique OpaqueCAS logCAS r@(Ref _ _ uid) o n log = M.insert uid (OpaqueCAS r o n) log -- If one is bothered with undefined below, use Nothing newRef :: a -> IO (Ref a) newRef x = do r1 <- newIORef x r2 <- newIORef undefined -- auxiliary u <- newUnique return (Ref r1 r2 u) writeOld :: OpaqueCAS -> IO () writeOld (OpaqueCAS (Ref _ ra _) o n) = writeIORef ra o readOld :: OpaqueCAS -> IO OpaqueCAS readOld (OpaqueCAS r@(Ref _ ra _) _ n) = do o <- readIORef ra -- guard against errors and memory leaks writeIORef ra undefined return (OpaqueCAS r o n) writeNew :: OpaqueCAS -> IO () writeNew (OpaqueCAS (Ref _ ra _) o n) = writeIORef ra n readNew :: OpaqueCAS -> IO OpaqueCAS readNew (OpaqueCAS r@(Ref _ ra _) o _) = do n <- readIORef ra -- guard against error
Re: [Haskell-cafe] using ResourceT with MVars
On May 2, 2012, at 2:06 AM, Michael Snoyman wrote: > > I don't really know the details of LevelDB, but if the question is > "how do I run MVar operations in ResourceT", yes > the answer would be > lifted-base[1]. Since ResourceT is an instance of MonadBaseControl, > you can use any of the functions in Control.Concurrent.MVar.Lifted. Perfect. I didn't know about lifted-base. Many thanks, Warren ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] using ResourceT with MVars
On Wed, May 2, 2012 at 11:36 AM, Warren Harris wrote: > I would like to use LevelDB in my code, and the HEAD version of > leveldb-haskell now uses runResourceT to manage open db connections and > iterators. I would also like to run multiple threads, and coordinate them > for transaction-like behavior, i.e. read and writing data without > interruption. LevelDB doesn't support transactions itself, so the > alternative would seem to be using MVars for mutual exclusion. > > With the 0.0.3 version of leveldb-haskell, the get and put operations were > in the IO monad, which made it trivial to write something like this: > > withMVar state $ \db -> do > maybeValue <- get db rdOpts key > put db wrOpts key $ maybe init incr maybeValue > > Now with the HEAD version, the get and put operations have types: > > get :: MonadResource m => DB -> ReadOptions -> ByteString -> m > (Maybe ByteString) > put :: MonadResource m => DB -> WriteOptions -> ByteString -> ByteString -> > m () > > I don't think it makes sense in general to lift the withMVar into > MonadResource and use runResourceT to run its body in IO. This would not > satisfy the intention behind using ResourceT -- resource allocated inside > the withMVar body would be deallocated when the withMVar scope is exited, > rather than being managed by the outermost ResourceT. (Although, in this > case we aren't allocating any resources, so maybe it's a moot point for my > simple example.) > > I also don't think it makes sense to use takeMVar and putMVar instead of > withMVars as this would subvert the exception handling that withMVars > provides. And my attempts to define a withMVarR (in the ResourceT IO monad) > also seem to require runResourceT: > > withMVarR :: MVar a -> (a -> ResourceT IO b) -> ResourceT IO b > withMVarR m io = do > -- mask $ \restore -> do > a <- lift $ takeMVar m > b <- {-restore-} (io a) `onExceptionR` (lift $ putMVar m a) > lift $ putMVar m a > return b > > onExceptionR :: ResourceT IO a -> ResourceT IO b -> ResourceT IO a > onExceptionR a b = do > runResourceT $ transResourceT (\a -> transResourceT (onException a) b) a > > Maybe I need to create a "HasMVar" class analogous to HasRef? > (http://hackage.haskell.org/packages/archive/conduit/0.0.0/doc/html/Control-Monad-Trans-Resource.html#t:HasRef) > > I'd appreciate any suggestions on how to make these fit together. > > Warren > > ___ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe > I don't really know the details of LevelDB, but if the question is "how do I run MVar operations in ResourceT", the answer would be lifted-base[1]. Since ResourceT is an instance of MonadBaseControl, you can use any of the functions in Control.Concurrent.MVar.Lifted. Michael [1] http://hackage.haskell.org/packages/archive/lifted-base/0.1.1/doc/html/Control-Concurrent-MVar-Lifted.html ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] using ResourceT with MVars
I would like to use LevelDB in my code, and the HEAD version of leveldb-haskell now uses runResourceT to manage open db connections and iterators. I would also like to run multiple threads, and coordinate them for transaction-like behavior, i.e. read and writing data without interruption. LevelDB doesn't support transactions itself, so the alternative would seem to be using MVars for mutual exclusion. With the 0.0.3 version of leveldb-haskell, the get and put operations were in the IO monad, which made it trivial to write something like this: withMVar state $ \db -> do maybeValue <- get db rdOpts key put db wrOpts key $ maybe init incr maybeValue Now with the HEAD version, the get and put operations have types: get :: MonadResource m => DB -> ReadOptions -> ByteString -> m (Maybe ByteString) put :: MonadResource m => DB -> WriteOptions -> ByteString -> ByteString -> m () I don't think it makes sense in general to lift the withMVar into MonadResource and use runResourceT to run its body in IO. This would not satisfy the intention behind using ResourceT -- resource allocated inside the withMVar body would be deallocated when the withMVar scope is exited, rather than being managed by the outermost ResourceT. (Although, in this case we aren't allocating any resources, so maybe it's a moot point for my simple example.) I also don't think it makes sense to use takeMVar and putMVar instead of withMVars as this would subvert the exception handling that withMVars provides. And my attempts to define a withMVarR (in the ResourceT IO monad) also seem to require runResourceT: withMVarR :: MVar a -> (a -> ResourceT IO b) -> ResourceT IO b withMVarR m io = do -- mask $ \restore -> do a <- lift $ takeMVar m b <- {-restore-} (io a) `onExceptionR` (lift $ putMVar m a) lift $ putMVar m a return b onExceptionR :: ResourceT IO a -> ResourceT IO b -> ResourceT IO a onExceptionR a b = do runResourceT $ transResourceT (\a -> transResourceT (onException a) b) a Maybe I need to create a "HasMVar" class analogous to HasRef? (http://hackage.haskell.org/packages/archive/conduit/0.0.0/doc/html/Control-Monad-Trans-Resource.html#t:HasRef) I'd appreciate any suggestions on how to make these fit together. Warren___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Haskell Hackathon in Munich
Hi Heinrich, > the Munich Haskell Meeting is glad to announce a local one day > Hackathon in Munich. It will take place the 12th of May 2012 from > 10am to 6pm. Please checkout the details at: I'll join. BTW: Any reason why we would not want to put this on the wiki? And can we create an IRC channel on freenode for that (#munihac, or anything)? Cheers, Simon ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] twitter election on favorite programming language
Hello Leon, > Out of curiousity, was this a plurality election (vote for one), or an > approval election (vote for many)? Vote for one. This application requires "twitter login". --Kazu ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Learn you
Hello cafe, Translating "Learn You a Haskell for Great Good" into Japanese was finished and will be published on 22 May. I guess it's worth watching its cover page: http://www.amazon.co.jp/%E3%81%99%E3%81%94%E3%81%84Haskell%E3%81%9F%E3%81%AE%E3%81%97%E3%81%8F%E5%AD%A6%E3%81%BC%E3%81%86-Miran-Lipova%C4%8Da/dp/4274068854 There are two translators: Tanaka is the author of "peggy" and Muranushi is the author of "Monadius". Regards, --Kazu ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe