[Haskell-beginners] Boilerplate Code

Brent Yorgey byorgey at seas.upenn.edu
Tue Aug 3 09:18:39 EDT 2010


On Tue, Aug 03, 2010 at 09:51:45PM +1000, Matt Andrew wrote:
> Hi all,
> 
> I am in the process of writing a Scheme interpreter/compiler in Haskell as my first serious project after learning the basics of Haskell. The goal is to really get a feel for Haskell. I am trying to accomplish this as much as I can on my own, but am referring to Jonathan Tang's 'Write Yourself a Scheme in 48 hours' whenever I get really stuck.
> 
> I have a question regarding a pattern that I have found within my code for which I cannot seem to find an abstraction.
> 
> I am implementing some of the primitive Scheme type-checker functions with the following code:
> 
> numberP :: SchemeVal -> SchemeVal
> numberP (Number _) = Bool True
> numberP _          = Bool False
> 
> boolP :: SchemeVal -> SchemeVal
> boolP (Bool _) = Bool True
> boolP _        = Bool False
> 
> symbolP :: SchemeVal -> SchemeVal
> symbolP (Atom _) = Bool True
> symbolP _        = Bool False
> 
> This is a pattern that I could easily provide an abstraction for with a Lisp macro, but I'm having trouble discovering if/how it's possible to do so elegantly in Haskell. The closest (but obviously incorrect) code to what I'm trying to accomplish would be:

It isn't really possible to abstract this any further in Haskell.
Constructors are rather magical functions, but they are still
functions, and like other functions cannot be compared for equality
directly.  Pattern-matching them is the only sort of equality
comparison you get.

With that said, your intuition to use Lisp macros is a good one.
Haskell has a similar metaprogramming facility called Template
Haskell, which could easily be used to automatically generate these
sorts of functions.  Of course, it's a little more complicated than
Lisp macros since Haskell syntax is so much more complex than Lisp's
-- but given that, on the whole it's not so bad.  I wouldn't use TH to
generate just the three functions you showed -- but I would certainly
consider it for ten.

-Brent


More information about the Beginners mailing list