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

How does interact work with Haskell on a multiline string?

我正在尝试使用 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" 作为字符串传递。我们可以通过使用 show as function:

轻松验证
main = interact <b>show</b>

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

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

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

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

我们看到:

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

因此,在这种情况下,通过使用 lines,我们检索了包含两个元素 "5 6 7""3 6 9".

的列表