You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Idris2中读取全部标准输入?

在Idris2中读取全部标准输入的惯用方法

当编译时无法确定输入行数,且需要区分输入中的空行与输入结束时,Idris2有两种常用解决方案:

方案一:一次性读取全部输入

使用Prelude提供的getContents : HasIO io => io String,它会直接读取整个标准输入流直到EOF,返回完整的字符串。之后可以用lines : String -> List String将其分割为行列表,自然保留输入中的空行,且不会产生多余的空字符串。

示例代码:

module Solve

import Data.List

main : IO ()
main = do
  content <- getContents
  let linesList = lines content
  traverse_ (\line => putStrLn ("'" ++ line ++ "'")) linesList

方案二:逐行读取并检测EOF

借助isEOF : HasIO io => io Bool检测输入流是否结束,以此作为递归终止条件,逐行读取所有内容。这种方式可以在读取过程中实时处理每行数据,无需一次性加载全部输入。

示例代码:

module Solve

readAllLines : IO (List String)
readAllLines = do
  eof <- isEOF
  if eof
    then pure []
    else do
      line <- getLine
      rest <- readAllLines
      pure (line :: rest)

main : IO ()
main = do
  allLines <- readAllLines
  traverse_ (\line => putStrLn ("'" ++ line ++ "'")) allLines

测试验证

用包含三行(中间有空行)的输入测试上述程序,输出结果如下:

'foo'
''
'bar'

完美区分了输入中的空行与输入结束,不会产生多余的空行输出。

内容的提问来源于stack exchange,提问作者Tomas Aschan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 15:55:28