繁体   English   中英

将字符串转换为Haskell中的Type构造函数

[英]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或反射恶作剧的情况下重构代码,只需将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特殊情况,你仍然可以在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM