【问题标题】:Read A String Exactly As It Is in Haskell完全按照 Haskell 中的方式读取字符串
【发布时间】:2019-12-16 20:23:27
【问题描述】:

我的程序是这样的:

func = do
      text <- getLine
      return text

如果我阅读\123\456 行,结果自然是\\123\\456。 我怎样才能得到\123\456作为结果?

【问题讨论】:

  • 不,如果您阅读\123\456,您将其阅读为\123\456。注意字符串的content和字符串的representation是有区别的。
  • 顺便注意,您可以将func 定义简化为func = getLine,这反而引发了为什么需要将其定义为单独操作的问题。
  • @RobinZigmond 这是我实际功能的简化版本,我只留下了重要信息
  • “我不希望 '\' 成为我的字符串的一个元素”但“我确实希望它在字符串中” - 不计算。你说的自相矛盾。
  • 我想你想read ('"' : text ++ "\"") :: String

标签: haskell io io-monad


【解决方案1】:

根据 cmets 中的讨论,您似乎想将字符串解析为字符串 literal,只是它没有被引号括起来。

我们可以在这里使用read :: Read a =&gt; String -&gt; a 来解析字符串,就好像它是字符串的字符串文字一样。唯一的问题是这个字符串被双引号括起来(")。

因此,我们可以添加这些引号,并使用:

<b>read</b> ('"' : text ++ "\"") :: String

然而,并非每个字符串 text 本身都是有效的字符串文字,因此上述方法可能会失败。例如,如果 text 本身包含一个双引号,则它的前面不直接有反斜杠 (\)。

【讨论】:

  • @arryn 你有理由想要read 而不是只使用字符串吗?如果您有一个字符串the string you want,那么为什么要使用read ('"' : text" ++"\"") 而不是只使用变量text
猜你喜欢
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多