<div dir="ltr">I have never used Data.Typeable, but maybe it could be made relevant here?<br><br><div class="gmail_quote">On Tue, Aug 3, 2010 at 4:18 PM, Brent Yorgey <span dir="ltr">&lt;<a href="mailto:byorgey@seas.upenn.edu">byorgey@seas.upenn.edu</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="im">On Tue, Aug 03, 2010 at 09:51:45PM +1000, Matt Andrew wrote:<br>
&gt; Hi all,<br>
&gt;<br>
&gt; 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&#39;s &#39;Write Yourself a Scheme in 48 hours&#39; whenever I get really stuck.<br>

&gt;<br>
&gt; I have a question regarding a pattern that I have found within my code for which I cannot seem to find an abstraction.<br>
&gt;<br>
&gt; I am implementing some of the primitive Scheme type-checker functions with the following code:<br>
&gt;<br>
&gt; numberP :: SchemeVal -&gt; SchemeVal<br>
&gt; numberP (Number _) = Bool True<br>
&gt; numberP _          = Bool False<br>
&gt;<br>
&gt; boolP :: SchemeVal -&gt; SchemeVal<br>
&gt; boolP (Bool _) = Bool True<br>
&gt; boolP _        = Bool False<br>
&gt;<br>
&gt; symbolP :: SchemeVal -&gt; SchemeVal<br>
&gt; symbolP (Atom _) = Bool True<br>
&gt; symbolP _        = Bool False<br>
&gt;<br>
&gt; This is a pattern that I could easily provide an abstraction for with a Lisp macro, but I&#39;m having trouble discovering if/how it&#39;s possible to do so elegantly in Haskell. The closest (but obviously incorrect) code to what I&#39;m trying to accomplish would be:<br>

<br>
</div>It isn&#39;t really possible to abstract this any further in Haskell.<br>
Constructors are rather magical functions, but they are still<br>
functions, and like other functions cannot be compared for equality<br>
directly.  Pattern-matching them is the only sort of equality<br>
comparison you get.<br>
<br>
With that said, your intuition to use Lisp macros is a good one.<br>
Haskell has a similar metaprogramming facility called Template<br>
Haskell, which could easily be used to automatically generate these<br>
sorts of functions.  Of course, it&#39;s a little more complicated than<br>
Lisp macros since Haskell syntax is so much more complex than Lisp&#39;s<br>
-- but given that, on the whole it&#39;s not so bad.  I wouldn&#39;t use TH to<br>
generate just the three functions you showed -- but I would certainly<br>
consider it for ten.<br>
<font color="#888888"><br>
-Brent<br>
</font><div><div></div><div class="h5">_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/beginners" target="_blank">http://www.haskell.org/mailman/listinfo/beginners</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br><div>()  ascii ribbon campaign - against html e-mail <div>/\  <a href="http://www.asciiribbon.org" target="_blank">www.asciiribbon.org</a>   - against proprietary attachments</div>
</div><div><br></div><div>          Alex R</div><br>
</div>