【问题标题】:How does interact work with Haskell on a multiline string?交互如何在多行字符串上与 Haskell 一起工作?
【发布时间】:2020-11-09 17:54:04
【问题描述】:

我正在尝试使用 Haskell 练习声明式编程,但我对交互函数感到有些困惑。

我可以从它的类型签名中看到它一次对整个字符串进行操作:

interact :: (String -> String) -> IO ()

多行输入的字符串值是多少?我假设它是一个带有换行符的单个字符串?

对于 Haskell 程序 Main.hs

module Main where

main :: IO ()
main = interact( ... )

还有一个输入文件input.txt

5 6 7
3 6 10

如果我像这样运行编译后的程序:

$ Main < input.txt

交互使用的字符串是:

5 6 7\n3 6 10

【问题讨论】:

  • 它将传递一个字符串"5 6 7\n3 6 10\n"作为参数。所以是的,您可以使用lines 将其转换为Strings 的列表。

标签: haskell functional-programming interactive


【解决方案1】:

它将"5 6 7\n3 6 10\n" 作为字符串传递。我们可以很容易地通过使用show 作为函数来验证这一点:

main = interact <b>show</b>

如果我们随后使用 I/O 重定向调用程序,我们会得到:

./Main < data.dat
"5 6 7\n3 6 10\n"

您可以使用lines :: String -&gt; [String]String 转换为Strings 列表,其中每个字符串都是一行。如果我们将程序更改为:

main = interact (show . <b>lines</b>)

我们看到了:

./Main < data.dat
["5 6 7","3 6 10"]

因此,在这种情况下,通过使用lines,我们检索到两个元素的列表"5 6 7""3 6 9"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    相关资源
    最近更新 更多