通过阅读Graham赫顿的《Haskell编程》(第二版),我成功地解决了练习10.5(第138页)。任务是编写一个函数adder :: IO ()
,它读取n
数字(交互式定义),对它们求和,并打印结果,如下所示:
> adder
How many numbers? 3
5
4
6
The total is 15
函数readInt
和readLine
已经给出为:
readInt :: IO Int
readInt = do
line <- readLine
return (read line :: Int)
readLine :: IO String
readLine = do
c <- getChar
case c of
'\n' -> return []
_ -> do
cs <- readLine
return (c:cs)
所以我只需要写adder
函数:
adder :: IO ()
adder = do
putStr "How many numbers? "
n <- readInt
ns <- sequence [readInt | _ <- [1..n]]
sum <- sumUp ns
putStr $ "The total is " ++ (show sum) ++ "\n"
sumUp :: [Int] -> IO Int
sumUp xs = return $ foldl (+) 0 xs
我几乎对我的解决方案很满意,但我只想内联sumUp
函数。但是,我不知道该怎么做。
如何将[a] -> IO a
函数内联到do
块中?
1条答案
按热度按时间ugmeyewa1#
这里不需要用
return
,我们可以用**sum :: (Foldable f, Num a) => f a -> a
**来求和:我们也可以重复
readInt
到**replicateM :: Applicative m => Int -> m a -> m [a]
**:对于
readInt
,这可以实现为: