有谁知道 Haskell 中是否有一个函数可以做这样的事情:
"Int" -> Int
"String" -> String
"Bool" -> Bool
IE。它采用类型构造函数名称的字符串表示形式,并在表达式和模式中将其转换为实际的类型构造函数。
编辑:
我的总体目标是简化如下内容:
transExp (Add exp1 exp2) vars
= transExp exp1 vars ++ transExp exp2 vars ++ [IAdd]
transExp (Sub exp1 exp2) vars
= transExp exp1 vars ++ transExp exp2 vars ++ [ISub]
变成单个模式匹配,所以基本上将 Add 或 Sub 转换为字符串,在前面添加一个“I”,然后将其转换回类型。
最佳答案
这里有一种更好的方法来重构您的代码,无需任何模板 Haskell 或反射恶作剧,只需将您的 Add
和 Sub
案例合并为一个:
data BinOp = Add | Sub | ...
data Expr = ...
| BinOp BinOp Expr Expr
| ...
transExp (BinOp op exp1 exp2) vars
= transExp exp1 vars ++ transExp exp2 vars ++ [transOp op]
...
transOp Add = IAdd
transOp Sub = ISub
这样,我们使用数据类型直接表达二元运算符相关的事实,因此具有相似的翻译。如果您想在某处添加特殊情况,您仍然可以在
BinOp Add exp1 exp2
上进行模式匹配。