自定义数据类型的Haskell show定义对前导引号的使用不一致

Max*_*ahm 2 haskell show

这是我正在处理的代码的简化版本

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递归地应用于e1e2.

show (Add e1 e2) = "( " ++ show e1 ++ " + " ++ show e2 ++ " )" 
Run Code Online (Sandbox Code Playgroud)