【问题标题】:Reading 2-line input Haskell读取 2 行输入 Haskell
【发布时间】:2016-03-13 13:25:20
【问题描述】:

我已经完成了一个 Haskell 程序的编写,但是它的 I/O 和 Main 部分出现了问题。我想读取以下格式的输入:

10 3
1 4 8

第一个和第二个数字是Ints,第二行的数字应该做成一个整数列表,[Int]。列表的长度等于第一行的第二个数字。

我有以下代码一次读取一个 Int,但是,它只能让它在输入的第一行工作。

getInt :: IO Int
getInt = do
    l <- getLine
    return (read l) 

我做错了什么?

【问题讨论】:

  • 看看words 函数——像map read . words 这样的函数应该适合你
  • 顺便说一句:我有点惊讶你声称你的函数在 "10 3" 上工作 - 我本来希望这会给你一个 no parse 错误
  • 我确实收到了一个无解析错误,尽管我认为这是由于第二个输入行和一个与文件结尾相关的错误。
  • 不-这是因为您尝试一次读取两个数字-但是您可以使用我谈到的map read . words-如果您愿意,您也可以进行模式匹配:[x, y] &lt;- map read . words &lt;$&gt; getLine 应该可以解决问题这里是第一行 - 您只需 numbers &lt;- map read . words &lt;$&gt; getLine 即可获得第二行(在列表中)(当然都在 do 块中!)
  • 非常有帮助。非常感谢!

标签: haskell functional-programming


【解决方案1】:

您应该能够通过以下方式获取此处显示的数据:

readData :: IO (Int, [Int])
readData = do
    [nr, _] <- map read . words <$> getLine
    nrs     <- map read . words <$> getLine
    return (nr,nrs)

这将读取两行并返回 10 作为第一个组件和 [1,4,8] 作为元组的第二个组件(如果您在示例中阅读)

由于第一行中的第二个数字将只是返回列表的length,因此我在此处略过。

当然,您可能希望根据自己的需要进行调整。

【讨论】:

    猜你喜欢
    • 2019-04-07
    • 2014-05-28
    • 2012-04-02
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    相关资源
    最近更新 更多