[Haskell-cafe] Compiler's bane
Brandon S. Allbery KF8NH
allbery at ece.cmu.edu
Thu Sep 4 14:27:24 EDT 2008
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
More information about the Haskell-Cafe
mailing list