【发布时间】:2022-12-03 10:35:14
【问题描述】:
我想弄清楚如何做一些非常简单的事情:阅读全部将标准输入转换为字符串(或者字符串列表也可以)。
Prelude 有 getLine : HasIO io => io String,它可以给我一条线,但它并没有给我一种知道我已经读完的方法。如果没有更多的输入,它只会给我一个空字符串,这意味着如果输入包含空行,除了输入的末尾我无法分辨。
考虑以下程序:
module Example
main : IO ()
module Solve
main : IO ()
main = do
putStrLn ("'" ++ !getLine ++ "'")
putStrLn ("'" ++ !getLine ++ "'")
putStrLn ("'" ++ !getLine ++ "'")
putStrLn ("'" ++ !getLine ++ "'")
putStrLn ("'" ++ !getLine ++ "'")
putStrLn ("'" ++ !getLine ++ "'")
该程序将打印六行,每行用单引号括起来,从标准输入中获取内容。如果我将它编译为 ./example 并使用三行输入运行,中间有一个空行,输出如下:
$ ./example <<EOF
foo
bar
EOF
'foo'
''
'bar'
''
''
''
请注意,它会在标准输入流耗尽后继续打印出行。这意味着如果我把它放在某个递归函数中以获得所有输入,我就没有合理的停止条件。
在构建时不知道会有多少行输入的情况下,读取 Idris2 中所有标准输入的惯用方法是什么?
【问题讨论】: