【问题标题】:Haskell + output String as type StringHaskell + 输出字符串为字符串类型
【发布时间】:2016-01-11 20:18:38
【问题描述】:

我写了一个基本的递归函数:

bibliography_rec :: [(String, String, Int)] -> String
bibliography_rec [] = ""
bibliography_rec (x:xs) = (citeBook x) ++ "\n" ++ (bibliography_rec xs)

citeBook 只是将元组重新格式化为字符串。

使用此输入运行时:

ghci> bibliography_rec [("Herman Melville", "Moby Dick", 1851),("Georgy Poo", "Alex Janakos", 1666)]

它产生:

"Moby Dick (Herman Melville, 1851)\nAlex Janakos (Georgy Poo, 1666)\n"

我需要逐行打印,所以我使用了这个:

bibliography_rec (x:xs) = putStr ((citeBook x) ++ "\n" ++ (bibliography_rec xs))

我的问题是我的输出需要是String而不是IO ()

我已经被困在这个问题上太久了,所以任何帮助都很棒!

【问题讨论】:

  • String 类型的值无法产生输出。所以你的要求(“我必须产生输出”和“返回类型必须是String”)是冲突的。

标签: string haskell io


【解决方案1】:

看起来你已经在那里了,你只需要 putStrLn 字符串而不是 printing 它(这是 ghci 默认所做的)。 print 首先通过show 运行它的参数,所以它会引用"\n" 等转义字符。

ghci> putStrLn $ bibliography_rec [...]

【讨论】:

  • 唯一的问题是我需要生成只有 ghci 的字符串> bibliography_rec [(...),(...)] 或者我还缺少什么。 $还有什么作用??
  • @ajanakos 您肯定缺少一些东西。 String 值只是 String 值,在 Haskell 中这意味着它没有副作用,并且根本无法执行诸如在屏幕上打印值之类的操作。在 GHCi 中,当您评估一个值时,它会在幕后执行 IO 操作,以便您看到显示的该值的 表示,否则 GHCi 的“交互”部分不会真的很有用。请注意,输入 GHCi 的代码与执行 .hs 文件不同。
  • @ajanakos $ 运算符在 stackoverflow 和互联网的其余部分有很多很多的讨论、澄清等,我不会在这里详细介绍,但我只想说这是一个具有特定操作顺序的无操作运算符,以便您可以经常删除括号。上面的代码行可以等效地写为putStrLn (bibliography_rec [...]),并且它在执行上是相同的。这在使用 f $ g $ h 1 而不是 f (g (h 1))) 之类的东西时派上用场,其中括号大多只是添加噪音。
猜你喜欢
  • 2021-12-12
  • 2022-10-02
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多