我正试图使用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"
的列表。