[英]Convert a String to a Type Constructor in Haskell
有没有人知道Haskell中是否有一个函数可以做这样的事情:
"Int" -> Int
"String" -> String
"Bool" -> Bool
即。 它采用类型构造函数名称的字符串表示形式,并将其转换为实际类型构造函数,包括表达式和模式。
编辑:我的总体目标是简化:
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
特殊情况,你仍然可以在BinOp Add exp1 exp2
模式匹配。
在哪种情况下? 有模板Haskell和Data.Typeable
,但是对于实际有用的答案,您需要提供更多详细信息。
好吧,这是问题所在。
"String" -> String
这在Haskell-land中是胡言乱语,因为"String"
是一个值,但String
是一种类型。 所以你可以试试这个:
String -> a
这不符合你的要求。 您应该学习如何阅读类型签名,因为如果您无法读取类型签名,那么您将在Haskell中遇到严重障碍。 上面的类型意味着“给我一个字符串,我可以给你一个你要求的任何类型的值。” 这个签名的前奏中有一个函数,它被称为error
,这不是你想要的。
听起来你想要这些东西:
String -> TypeRep
对不起,没有这样的功能。 TypeRep
不实例化Read
类。
什么是你真正想在这里做什么? 如果您告诉我们您实际上想要做什么,我们可以帮助您解决这个问题,而不是尝试帮助解决这个问题。
你不能这样做,因为字符串是运行时数据,类型必须在编译时完全解析。 你可以用你的例子做的最好的是帮助函数,以消除一些重复:
helper exp1 exp2 vars op = transExp exp1 vars ++ transExp exp2 vars ++ [op]
transExp (Add exp1 exp2) vars = helper exp1 exp2 vars IAdd
transExp (Sub exp1 exp2) vars = helper exp1 exp2 vars ISub
但从长远来看,这可能实际上并不是非常有用,具体取决于您拥有的案例数量。
通常,模式匹配是针对类型结构运行的,因此必须在编译类型中针对具体类型构造函数进行拼写。 这是您拥有一个非常稳固的静态类型系统所需要付出的代价。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.