Haskell先读n行

时间:2012-06-01 22:59:13

标签: haskell functional-programming stdout stdin

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

大多数问题都来自stdin,数据如下:

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

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

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

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

2 个答案:

答案 0 :(得分:10)

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

perLine

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

编辑:如果您仍然只想处理前main = interact processInput processInput input = unlines [perLine line | line <- lines input] perLine line = reverse line -- do whatever you want to 'line' here! 行,可以使用上例中的n函数,如下所示:

take

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

答案 1 :(得分:0)

您还可以使用简单的递归:

getMultipleLines :: Int -> IO [String]
getMultipleLines n
    | n <= 0 = return []
    | otherwise = do
        x <- getLine
        xs <- getMultipleLines (n-1)
        return (x:xs)

然后在您的主目录中使用它:

main :: IO ()
main = do
    line <- getLine
    let numLines = read line :: Int
    inputs <- getMultipleLines numLines