getLine x次haskell

Vik*_*ren 2 io haskell stream

基于Hackerrank的问题

我的问题是如何在stdIn上进行getLine t次?

main = do
    t <- getInt
    let x = [divisorsInNumber unsafeGetInt | a <-[1..t] ]
    print x

getInt :: IO Int
getInt = fmap read getLine

unsafeGetInt :: Int
unsafeGetInt = unsafePerformIO getInt

divisorsInNumber n = length $ filter (== True) $ map (isDivisor n) (integralToListOfInts n)
Run Code Online (Sandbox Code Playgroud)

mar*_*iop 8

只需复制t次getLine操作replicateM:

import Control.Monad (replicateM)

getLines :: Int -> IO [String]
getLines t = replicateM t getLine
Run Code Online (Sandbox Code Playgroud)

因此getInts,这是getIntt次,可以表示为:

getInts :: Int -> IO [Int]
getInts = fmap read <$> getLines
Run Code Online (Sandbox Code Playgroud)

重写使用的完整代码getInts可以是:

import Control.Applicative ((<$>))
import Control.Monad (replicateM)


getLines :: Int -> IO [String]
getLines n = replicateM n getLine

getInts :: Int -> IO [Int]
getInts n = fmap read <$> getLines n

getInt :: IO Int
getInt = fmap read getLine

divisorsInNumber :: Int -> Int
divisorsInNumber n = length $ filter (isDivisor n) (integralToListOfInts n)

main :: IO ()
main = do
    t <- getInt
    nums <- getInts t
    let x = [divisorsInNumber num | num <- nums]
    print x
Run Code Online (Sandbox Code Playgroud)

  • 为什么不只是`getInts = fmap read \`fmap \`getLines`? (2认同)