Haskell先读n行

GTD*_*Dev 2 stdin haskell functional-programming stdout

我正在努力学习Haskell以适应函数式编程语言.我决定在面试时尝试一些问题,然后开始.我无法从stdin读取并且通常使用haskell的懒惰io来做io.

大多数问题的数据来自stdin,格式如下:

n
data line 1
data line 2
data line 3
...
data line n
Run Code Online (Sandbox Code Playgroud)

其中n是来自stdin的后续行数,下一行是数据.

如何在n行中的每一行上一次运行我的程序并将解决方案返回到stdout?

我知道stdin输入不会很大,但我要求一次评估每一行,假装输入大于内存中只能学习如何使用haskell.

val*_*man 10

您可以interact结合使用lines,一次处理来自stdin的数据.这是一个示例程序,用于interact访问stdin,lines分割每个换行符上的数据,列表解析以将函数perLine应用于输入的每一行,以及unlines将输出perLine重新放在一起.

main = interact processInput

processInput input = unlines [perLine line | line <- lines input]

perLine line = reverse line -- do whatever you want to 'line' here!
Run Code Online (Sandbox Code Playgroud)

您不必担心通过标准输入获得的数据大小; Haskell的懒惰确保您只能随时保留您实际工作的部分.

编辑:如果你仍想只处理第一n行,你可以使用take上面例子中的函数,如下所示:

processInput input = unlines [perLine line | line <- take 10 (lines input)]
Run Code Online (Sandbox Code Playgroud)

这将在读取和处理前十行后终止程序.