4 Sep 20:27
Re: Compiler's bane
Brandon S. Allbery KF8NH <allbery <at> ece.cmu.edu>
2008-09-04 18:27:24 GMT
2008-09-04 18:27:24 GMT
On Sep 4, 2008, at 13:41 , Andrew Coppin wrote: > Ryan Ingram wrote: >> It's pretty simple, I think. >> >> type ExpGen = ReaderT [String] Gen >> >> arbExp :: ExpGen Expression >> -- exercise for the reader >> >> instance Arbitrary Expression where >> arbitrary = runReaderT arbExp [] >> coarbitrary = coarbExp >> >> coarbExp (Var s) = variant 0 . coarbitrary s >> coarbExp (Apply a b) = variant 1 . coarbitrary a . coarbitrary b >> coarbExp (Lambda s e) = variant 2 . coarbitrary s . coarbitrary e >> >> instance Arbitrary Char where >> arbitrary = elements "abcdefghijklmnopqrstuvwxyz_" >> coarbitrary = coarbitrary . fromEnum >> > > o_O > > I love the way other people have wildly different ideas of "simple" > than me. I'm staring at this and completely failing to comprehend > it. (But then, anything with "co" in the name generally makes little > sense to me...) Why on earth would you need a reader monad? Surely > if you want to add bound variables and then later query what > variables are bound, you'd want a state monad? Hmm, I'm completely > lost here. Reader, in this case, is a State monad with the addition of scopes: to create a new nested scope r' given a scope r, "let r' = local r". The [String] is a list of variable names, if this is doing what I think it is. -- -- brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allbery <at> kf8nh.com system administrator [openafs,heimdal,too many hats] allbery <at> ece.cmu.edu electrical and computer engineering, carnegie mellon university KF8NH
RSS Feed