【问题标题】:Haskell writes '\n' instead of a newlineHaskell 写 '\n' 而不是换行符
【发布时间】:2015-10-15 17:42:49
【问题描述】:

我有这段代码,而不是打印出“\n”,我希望它把下一个字符串放在一个新的行上,但似乎无法弄清楚。有什么指点吗?

onSeparateLines :: [String] -> String
onSeparateLines [] = ""
onSeparateLines ( x:[] ) = x
onSeparateLines ( x:xs ) = x ++  "\n" ++ onSeparateLines xs

我得到的是

"AAAA\nAAAA"

应该是:

"AAAA"
"AAAA"

【问题讨论】:

  • 我不知道为什么这被否决了。我们不会因为人们不了解他们的问题而对他们投反对票,对吗?毕竟,如果他们理解了这一点,那么他们将自己解决它。
  • @ReinHenrichs 你完全正确。我怀疑是拼写问题。我会修正标题并添加一些标签。
  • @ReinHenrichs Downvote 也适用于无用的问题。我觉得这个问题有点边缘(所以我不反对它,但我也不赞成它)。

标签: string haskell newline


【解决方案1】:

给定的函数和你对“\n”的使用是正确的,所以错误一定在别处。在不知道细节的情况下,我怀疑您正在使用(相当于)print 而不是putStr 来打印您的字符串。在打印之前确保您的字符串不是shown。

如果这是在 GHCi 中,请注意使用 print 打印值,所以

> onSeparateLines ["foo", "bar"]

print 字符串并显示转义字符。你想要的

> putStrLn (onSeparateLines ["foo", "bar"])

改为。

【讨论】:

  • 是的,它在终端中工作,但我需要它在函数内完成,所以我输入的只是 >onSeparateLines` 给出 `"foo" 并在下一行 "bar"
  • 我不知道你在说什么。 “我需要在函数内完成”是什么意思?您不能将onSeparateLines 应用于除字符串列表之外的任何内容。你必须在 GHCi 中使用 Haskell 语法,所以你不能直接输入onSeparateLines "foo" <ENTER> "bar" <ENTER>
  • onSeparateLines 自定义函数需要通过键入> onSeparateLines ["foo","bar"] 来工作,仅此而已。然后返回>"foo""bar" 下面的行,所以我认为问题出在我的代码中。我尝试将 putStr 函数放在 onSeparateLines 函数中,但它似乎不起作用。
  • 你不能那样做。 GHCi 将print 的值。没有办法阻止这种情况。您的函数是正确的:它将字符串列表与中间的换行符连接起来。如果您在 onSeparateLines 函数中包含 putStrLn,那么它将具有不同的类型。这将是一个函数[String] -> IO ()
  • onSerparateLines :: [String] -> IO() onSerparateLines = mapM_ putStrLn 是人的方式。我终于到了那里哈哈。
猜你喜欢
  • 2010-12-20
  • 1970-01-01
  • 2010-11-07
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多