这是我正在处理的代码的简化版本
data ArithExp = Con Int
| Add ArithExp ArithExp
instance Show ArithExp where
show (Con i) = show i
show (Add e1 e2) = show "( " ++ show e1 ++ " + " ++ show e2 ++ " )"
Run Code Online (Sandbox Code Playgroud)
所以,如果我运行命令
Add (Con 6) (Con 0)
Run Code Online (Sandbox Code Playgroud)
我想要的输出是:
( 6 + 0 )
Run Code Online (Sandbox Code Playgroud)
但上面的代码打印:
"( "6 + 0 )
Run Code Online (Sandbox Code Playgroud)
据我所知,show函数将第一个字符串中的引号打印为字符,然后在后面的串联中正确使用它们.这种行为对我来说似乎很不一致.任何有助于我获得正确输出的见解都将非常感激.提前致谢!
J. *_*son 10
在(Add e1 e2)分支show中绑定比绑定更紧密(++),所以你的代码更合理,
show (Add e1 e2) = (show "( ") ++ (show e1) ++ " + " ++ (show e2) ++ " )"
Run Code Online (Sandbox Code Playgroud)
诀窍是你真的不需要那个领先show- 你直接生成字符串,只需要show递归地应用于e1和e2.
show (Add e1 e2) = "( " ++ show e1 ++ " + " ++ show e2 ++ " )"
Run Code Online (Sandbox Code Playgroud)