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

Posted

技术标签:

【中文标题】为啥这个 Haskell 程序会产生反斜杠?【英文标题】:Why is this Haskell program making backslashes?为什么这个 Haskell 程序会产生反斜杠? 【发布时间】:2020-11-30 14:47:13 【问题描述】:

我是 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)

输出:

6 -> "3 -> \"10 -> \\\"5 -> \\\\\\\"16 -> \\\\\\\\\\\\\\\"8 -> \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"4 -> \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"2 -> \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"1\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\"\\\\\\\"\\\"\""

我希望反斜杠消失。

【问题讨论】:

简单,只需在运行main 之前将fix show 输入到ghci 中即可修复show 的工作方式。 ;-)(您需要导入Data.Function。) @DanielWagner 一些高级 Haskeller 可能会认为这是一个可爱的笑话,但它只会让任何问这个问题的人感到困惑。 @amalloy 我对我们博学的博伊斯比你更有信心。一张眨眼的脸,以及 ghci 立即以比你可以摇晃的更多的反斜杠回答,这对于任何人来说都是足够的线索,这只是为了好玩。如果没有,现在我们也有两个非常严肃的 cmets 告诉他们! 【参考方案1】:

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

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

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

【讨论】:

顺便说一下,请参阅***.com/questions/968198/haskell-show-screwed-up/… 了解添加引号的原因

以上是关于为啥这个 Haskell 程序会产生反斜杠?的主要内容,如果未能解决你的问题,请参考以下文章

为啥反斜杠出现两次?

为啥反斜杠出现两次?

为啥反斜杠出现两次?

为啥 ElasticSearch Nest Query 中会出现转义反斜杠?

为啥我的 jq / read / echo 管道会删除反斜杠?

为啥在定义为宏值的路径中指定的反斜杠会被删除?有没有办法避免这种情况?