Haskell中Int转String及自定义newtype Expr类型不匹配报错如何解决
问题原因
- 你定义的
newtype Expr = Expr String是给String类型套了一层名为Expr的包装,Expr构造器是唯一的String转Expr的合法方式。你现有代码中两个函数直接返回String类型的值,没有套构造器,自然会报类型不匹配错误。 - 派生
Show类的作用是让Expr类型的值可以作为show函数的入参,得到其字符串表示,和你需要的「把String包装为Expr」的逻辑完全无关,不能反过来实现String到Expr的自动转换。
修复方案
你只需要在返回结果处套上Expr构造器即可,修复后代码如下:
newtype Expr = Expr String deriving (Show) constant :: Int -> Expr constant n = Expr (show n) -- 将show得到的数值字符串用Expr构造器包装 variable :: String -> Expr variable v = Expr v -- 将变量名字符串用Expr构造器包装
效果测试
> constant 5 Expr "5" > variable "x" Expr "x"
如果后续要扩展表达式运算能力,比如实现加法拼接,可以按如下方式写工具函数:
add :: Expr -> Expr -> Expr add (Expr a) (Expr b) = Expr (a ++ " + " ++ b) -- 测试 > add (constant 3) (variable "y") Expr "3 + y"
内容的提问来源于stack exchange,提问作者Guilherme Salgueiro
相关产品推荐
相关产品推荐

