2

我正在尝试学习 Haskell 以适应函数式编程语言。我决定在interviewstreet尝试一些问题来开始。我在从标准输入读取和使用 haskell 的惰性 io 做一般 io 时遇到问题。

大多数问题的数据来自标准输入,格式如下:

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

其中 n 是来自标准输入的后续行数,下一行是数据。

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

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

4

2 回答 2

10

您可以interact结合使用 ,lines来一次处理来自标准输入的数据。这是一个示例程序,用于interact访问标准输入,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!

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

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

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

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

于 2012-06-01T23:06:53.877 回答
1

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

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

然后在你的 main 中使用它:

main :: IO ()
main = do
    line <- getLine
    let numLines = read line :: Int
    inputs <- getMultipleLines numLines
于 2018-12-05T11:43:31.247 回答