代码之家  ›  专栏  ›  技术社区  ›  Andrzej Gis

getLine懒惰吗?

  •  3
  • Andrzej Gis  · 技术社区  · 8 年前

    getLine

    假设我在输入上有一条很长的线。这只是一个数字序列。我只需要对前三个数字求和。将 getLine公司 要高效,只读取行的第一部分,还是我必须创建自己的懒行读取函数,即逐个读取字符?

    import Control.Applicative
    
    main = do
        line <- getLine'
        print $ sum $ map read $ take 3 $ words line
    
    getLine' :: IO String
    getLine' = do
        c <- getChar
        if c == '\n' then return [] else (c:) <$> getLine'
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   K. A. Buhr    8 年前

    虽然 getLine 不是懒惰, getContents lines words

    main :: IO ()
    main = do contents <- getContents
              let lns = lines contents
                  result = sum $ map read $ take 3 $ words $ head lns
              print (result :: Integer)
    

    putStrLn $ take 80 $ lns !! 1
    

    要打印第二行的前80个字符,程序必须先读取第一行(因此在程序的最后两行之间会挂起一段时间),然后再处理第二行的前80个字符。换句话说,这种懒散的台词阅读只有在你 只有 需要阅读第一行的第一部分,如果这对你来说不明显的话——哈斯克尔没有任何神奇的方法可以跳过第一行的其余部分到达第二行。

    main = do contents <- getContents
              let result = sum $ map read $ take 3 $ words contents
              print (result :: Integer)
    
    推荐文章