【问题标题】:Reading line by line in Haskell在 Haskell 中逐行阅读
【发布时间】:2016-03-01 12:24:00
【问题描述】:

我正在尝试逐行读取标准输入,并使用foo :: String -> Int 类型的函数处理每一行。如果我们不知道要读取的行数,或者考虑到第一行提供了行数,有什么方法可以做到这一点?

我尝试过的 很多东西都会产生无意义的错误,例如“解析器错误”。 例如

main = do {
    getLine <- getContents;
    let result = show (foo getLine);
    putStrLn (foo result);
}

编辑 奇怪,但这不会打印 a 的长度

main = do {
    a <- getContents;
    putStrLn (show (length a));
}

但是,这确实打印了 5。

main = do {
    a <- getContents;
    putStrLn (show 5);
}

【问题讨论】:

  • getLine 是haskell 中的内置函数,考虑将变量命名为其他名称吗?另外do 符号不需要{}

标签: haskell


【解决方案1】:

您可以使用函数lines 将String 转换为[String]。然后map 你的foo 在这个行列表中。

关于编辑:您打印长度的程序对我有用。尝试输入一个文件,或者 - 如果以交互方式输入 - 正确终止它(通过 Ctrl-d)。

旁注:大括号和分号通常很少见。但这只是风格。

【讨论】:

    【解决方案2】:

    这样做的主要示例如下所示:

    main = do
        line <- getLine
        yourfunction line
        main
    

    这将永远占用行并使用您的函数处理它们,如果您希望它在某个时间停止,只需检查一个命令,例如:

    main = do
        line <- getLine
        let res = yourfunction line
        if res == "Exit" then IO () else main
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多