我正在努力学习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。
答案 0 :(得分:10)
您可以将interact
与lines
结合使用,一次处理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