我试图逐行读取标准输入,并使用类型foo :: String -> Int
的函数处理每一行。有没有办法做到这一点,只要我们不知道我们想读的行数或者假设第一行提供了行数?
我尝试了什么 很多事情都会带来毫无意义的错误,例如"解析器错误"。 例如
main = do {
getLine <- getContents;
let result = show (foo getLine);
putStrLn (foo result);
}
修改 奇怪,但这不会打印出
的长度main = do {
a <- getContents;
putStrLn (show (length a));
}
但是,这确实打印了5。
main = do {
a <- getContents;
putStrLn (show 5);
}
答案 0 :(得分:2)
这样做的主要例子如下:
main = do
line <- getLine
yourfunction line
main
这将永远占用行并使用您的函数处理它们,以防您希望它在某个时间停止,只需检查命令,例如:
main = do
line <- getLine
let res = yourfunction line
if res == "Exit" then IO () else main
答案 1 :(得分:0)
您可以使用函数lines
将String转换为[String]。之后map
foo
通过此行列表。
关于编辑:打印长度的程序适合我。尝试输入文件或 - 如果以交互方式输入输入 - 正确终止(通过Ctrl-d)。
旁注:通常很少看到花括号和分号。但这只是风格。