有谁知道 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 或反射恶作剧,只需将您的 AddSub 案例合并为一个:

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 上进行模式匹配。

10-08 17:57