Does anyone know if there’s a function in Haskell which does something like this:
"Int" -> Int
"String" -> String
"Bool" -> Bool
ie. it takes a string representation of a type constructor name, and converts it to the actual type constructor, both in an expression and in a pattern.
edit:
My overall goal is to simplify something like:
transExp (Add exp1 exp2) vars
= transExp exp1 vars ++ transExp exp2 vars ++ [IAdd]
transExp (Sub exp1 exp2) vars
= transExp exp1 vars ++ transExp exp2 vars ++ [ISub]
Into a single pattern match, so basically convert Add or Sub to a string, add an “I” to the front, and convert it back to a type.
There is a much better way to refactor your code here without any Template Haskell or reflection shenanigans by simply joining your
AddandSubcases into one:This way, we’re using the data type to express directly the fact that binary operators are related, and therefore have similar translations. You can still pattern match on
BinOp Add exp1 exp2if you want to make a special case for addition somewhere.