【问题标题】:How do I read N lines in a file with Haskell?如何使用 Haskell 读取文件中的 N 行?
【发布时间】:2017-11-14 15:55:19
【问题描述】:

我有一个格式为:

3
1 2
3 4
5 7

其中第一行是行数

我知道:

getInt :: IO Int
getInt = readLn 

main = do num <- getInt
          print (num)

读取第一行。

接下来,我尝试了:

readInts :: IO [Int]
readInts = fmap (map read.words) getLine

读取一行并获取一个列表:[a,b]。

我尝试在递归循环中使用上述内容

loop :: Int -> IO()
loop n = if 1 == n then do num <- readInts 
                           print(num)
        else loop (n-1)

我只得到第一行:

[5,3]

但是我需要阅读其余的行,给定 N

【问题讨论】:

  • remainingLines &lt;- replicateM num getLine 为您获取剩余行的[String]
  • 我投票以“不清楚你在问什么”结束。如果您尝试过某事但失败了,您需要告诉我们。什么都不做,先来这里......好吧,这不是这个网站的运作方式。
  • @DanielWagner 我投票支持社区支持我改进我的问题...代替空洞的批评
  • @Alec 谢谢,这对我有用。我使用了remainingLines &lt;- replicateM num readInts,其中:readInts :: IO [Int] readInts = fmap (map read.words) getLine

标签: haskell io


【解决方案1】:

输入文件的格式看起来很像编程比赛中使用的格式。这是我的编程竞赛的标准设置:

import Control.Monad
import Text.Printf

main :: IO ()
main = do
    n <- readLn
    forM_ [1 .. n] $ \i -> do
        printf "Case %d: " (i :: Int)
        solve

solve 的示例可能是:

solve :: IO ()
solve = do
    nums <- map read . words <$> getLine
    print (sum nums)

【讨论】:

  • 在我看来,这是一个有用且简单的解决方案!谢谢!为了迭代“列表列表”,我修改了它,如下所示:readInts :: IO [Int] readInts = fmap (map read.words) getLine main :: IO () main = do num &lt;- readLn forM_ [1 .. num] $ \i -&gt; do compare &lt;- readInts print compare
【解决方案2】:

您是否查看过函数lines?它接受一个字符串并返回与由\n 分隔的列表相同的字符串。使用此功能,您甚至不必知道行数。

【讨论】:

    【解决方案3】:

    除了这个有用的answercomment,对于一些挑战,您需要收集n 行,然后根据数据的聚合在最后发出一个结果。创建列表的方法可能使用replicateM,如下所示:

    import Control.Monad
    
    toInt :: String -> Int
    toInt x = read x :: Int
    
    lineToInts :: String -> [Int]
    lineToInts x = map toInt $ words x
    
    main :: IO ()
    main = do
        n <- readLn
        remainingLines <- replicateM n getLine
        let list = map lineToInts remainingLines
        print list
    

    示例运行:

    3
    0 1
    3 4
    6 8
    [[0,1],[3,4],[6,8]]
    

    另见Read n lines input with Haskell

    【讨论】:

      猜你喜欢
      • 2019-04-07
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      • 2015-04-21
      相关资源
      最近更新 更多