2012-06-01 56 views
1

我在学习Haskell以习惯函数式编程语言。我决定在interviewstreet尝试一些问题以开始。我在阅读stdin时遇到了麻烦,并且一般用haskell的懒惰io来完成io。Haskell第n行读取

大多数问题具有从标准输入数据来为以下形式:

n 
data line 1 
data line 2 
data line 3 
... 
data line n 

其中n是从stdin来下面的行和下一行的数量是数据。

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

我知道标准输入的输入不会很大,但我一直在评估每一行,假装输入大于可以适应内存的内容,以便学习如何使用haskell。

回答

8

您可以使用interactlines一起处理stdin中的数据,一次一行。下面是一个示例程序,使用interact来访问stdin,lines来拆分每个换行符上的数据,列表理解将perLine函数应用到输入的每一行,而unlinesperLine的输出再次放回到一起。

main = interact processInput 

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

perLine line = reverse line -- do whatever you want to 'line' here! 

您不必担心通过标准输入法获得的数据的大小; Haskell的懒惰可以确保您随时只保留实际在内存中工作的部分。

编辑:如果您仍然希望只在第一n线工作,你可以使用take功能在上面的例子中,是这样的:

processInput input = unlines [perLine line | line <- take 10 (lines input)] 

这将前十行后终止程序已被阅读和处理。

+0

工作得很漂亮 – GTDev