
You're partially right. The Typeable is redundant because Data has the type:
(Typeable a) => Data a
-R. Kyle Murphy
--
Curiosity was framed, Ignorance killed the cat.
On Tue, Aug 3, 2010 at 15:01, Ozgur Akgun
Why do you need them to be Typeable? toConstr has the following type:
toConstr :: (Data a) => a -> Constr
Best,
On 3 August 2010 19:50, Kyle Murphy
wrote: I was close, this actually does what was asked:
import Data.Data
typeChecker :: (Typeable a, Typeable b, Data a, Data b) => a -> b -> Bool typeChecker a b = toConstr a == toConstr b
-R. Kyle Murphy -- Curiosity was framed, Ignorance killed the cat.
On Tue, Aug 3, 2010 at 14:42, Kyle Murphy
wrote: Actually looking at the original question I'm not sure my code does what was intended. I was looking at does some type (a b) == (a c), which wasn't exactly the question. Oh well, back to the drawing board.
-R. Kyle Murphy -- Curiosity was framed, Ignorance killed the cat.
On Tue, Aug 3, 2010 at 14:38, Kyle Murphy
wrote: Less of a dirty dirty hack (requires that SchemeVal be an instance of Typeable):
import Data.Typeable import Data.Maybe
typeChecker :: (Typeable a, Typeable b) => a -> b -> Bool typeChecker a b = f a == f b where f :: (Typeable a) => a -> Maybe TypeRep f = listToMaybe . typeRepArgs . typeOf
-R. Kyle Murphy -- Curiosity was framed, Ignorance killed the cat.
On Tue, Aug 3, 2010 at 13:51, Alex Rozenshteyn
wrote: That is a dirty, dirty hack.
On Tue, Aug 3, 2010 at 8:45 PM, Christian Maeder < Christian.Maeder@dfki.de> wrote:
Matt Andrew schrieb: > 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: > > typeChecker :: SchemeVal -> SchemeVal -> SchemeVal > typeChecker (cons _) (cons2 _) = Bool $ cons == cons2 > > I understand this code drastically misunderstands how pattern matching works, but (hopefully) it expresses what I'm trying to accomplish. Anyone have any suggestions?
typeChecker s1 s2 = let f = takeWhile isAlphaNum . show in Bool $ f s1 == f s2
hoping that my "f" just extracts the constructor as string.
C.
> I do realise that such an abstraction is barely worth it for the amount of code it will save, but this exercise is about learning the ins and outs of Haskell. > > Appreciate you taking the time to read this, > > Matt Andrew _______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners
-- () ascii ribbon campaign - against html e-mail /\ www.asciiribbon.org - against proprietary attachments
Alex R
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners
-- Ozgur Akgun