Dynamic Type Contruction

I'm trying to create a library to querying XML data using Strafunski. I'm also using DrIFT to generate the instances of Typeable and Term of my Datatypes to be used inside Strafunski. Supose i've this datatypes: data Shape = Circle Float (Float,Float) | Triangle (Float, Float) (Float, Float) (Float, Float) then DrIFT, among other things, creates the functions: isCircle (Circle _ _ ) = True isCircle _ = False isTriangle (Triangle _ _ _) = True isTriangle _ = False what i'd like to have "is" as a generic "isFoo" function, with the type: is :: String -> DataType -> Bool that when running will act like this: is "Circle" (Circle 3.4 (3.0,3.1)) = True is "Triangle" (Circle 3.4 (3.0,3.1)) = False is "Circle" 2 = False I was looking on TyCon constructor and mkTyCon function, but i didn't understood it well. Can anyone tell me how can i create this "is Foo" function? I was thinking about create a dynamic type with mkTyCon and then see if it matches with the DataType receiveid as function parameter. Regards, Vitor Rodrigues

Vitor, That's amazing!!! Your question is very timely! :-) You know ... someone just challenged me with this question, and I added the corresponding function to the boilerplate testsuite. However, it is much more typeful than you propose. I call it the "typeful reflection benchmark". http://www.cs.vu.nl/boilerplate/#suite http://www.cs.vu.nl/boilerplate/testsuite/getC.hs So you actually can write isC Circle <some term>. No string encoding! No possible confusion of different term types. Ralf Oops: I leave it as an exercise to implement this boilerplate pearl in Strafunski :-) Vitor Rodrigues wrote:
I'm trying to create a library to querying XML data using Strafunski. I'm also using DrIFT to generate the instances of Typeable and Term of my Datatypes to be used inside Strafunski.
Supose i've this datatypes:
data Shape = Circle Float (Float,Float) | Triangle (Float, Float) (Float, Float) (Float, Float)
then DrIFT, among other things, creates the functions:
isCircle (Circle _ _ ) = True isCircle _ = False isTriangle (Triangle _ _ _) = True isTriangle _ = False
what i'd like to have "is" as a generic "isFoo" function, with the type:
is :: String -> DataType -> Bool
that when running will act like this:
is "Circle" (Circle 3.4 (3.0,3.1)) = True is "Triangle" (Circle 3.4 (3.0,3.1)) = False is "Circle" 2 = False
I was looking on TyCon constructor and mkTyCon function, but i didn't understood it well. Can anyone tell me how can i create this "is Foo" function?
I was thinking about create a dynamic type with mkTyCon and then see if it matches with the DataType receiveid as function parameter.
Regards, Vitor Rodrigues
------------------------------------------------------------------------
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
participants (2)
-
Ralf Laemmel
-
Vitor Rodrigues