如何在多行字符串上与Haskell进行交互



我正试图使用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 7n3 6 10

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

main = interactshow

如果我们调用带有I/O重定向的程序,我们得到:

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

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

main = interact (show .lines)

我们看到:

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

因此,在本例中使用lines,我们检索两个元素"5 6 7""3 6 9"的列表。

最新更新