为什么这个 Haskell 程序会产生反斜杠?

Not*_* me 6 string recursion haskell output

我是 Haskell 的新手,写了这个程序来练习函数式编程。我不知道它是否是一个好程序,除了两件事。

  • 它有效(它向我展示了 Collat​​z 树中从 6 到 1 的路径)
  • 它打印了太多的反斜杠
next_step :: Integer -> Integer
collatz :: Integer -> String

next_step n = do
        if (n `mod` 2) == 0 then
                n `div` 2
        else
                (n * 3) + 1

collatz 1 = "1"
collatz n = (show n) ++ " -> " ++ (show (collatz (next_step n)))

main = putStrLn (collatz 6)
Run Code Online (Sandbox Code Playgroud)

输出:

6 -> "3 -> \"10 -> \\\"5 -> \\\\\\\"16 -> \\\\\\\\\\\\\\\"8 -> \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"4 -> \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"2 -> \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"1\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\"\\\\\\\"\\\"\""
Run Code Online (Sandbox Code Playgroud)

我希望反斜杠消失。

hap*_*ave 11

collatz已经返回一个字符串,所以你不需要调用show它:

collatz n = show(n) ++ " -> " ++ collatz (next_step n)
Run Code Online (Sandbox Code Playgroud)

使用show添加引号,然后由于嵌套引号而导致反斜杠。

  • 顺便说一句,请参阅 /sf/ask/67773891/#968228 了解添加引号的原因 (2认同)