我的问题是如何在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)
只需复制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)