下面是我的代码。我希望能够接受如下所示的用户输入:“ 6 1 2 3 4 5 6”,然后获取总和并打印出来。了解如何使用输入的第一个数字作为总数也很酷。因此,这里的第一个数字是6,输入的总数是6。
在此先感谢您为我提供帮助。我已经研究了数周,无法解决这个问题。
main = do
putStrLn "Enter how many numbers:" -- clearer
num<-getLine
putStrLn("Enter a number: ")
numberString <- getLine
let numberInt =(read numberString :: Int)
print (numberInt*4)
main
答案 0 :(得分:3)
似乎您需要一个辅助的递归函数来读取num
整数,或者需要像replicateM
这样的助手,这使得编写代码变得更加容易。
replicateM num action
精确运行action
次num
次,并将所有操作结果收集到一个列表中。
main = do
putStrLn "Enter how many numbers:" -- clearer
num<-getLine
numbers <- replicateM num $ do
putStrLn("Enter a number: ")
numberString <- getLine
return (read numberString :: Int)
-- here we have numbers :: [Int]
...
然后您可以从那里继续。
如果您想使用辅助功能,则可以编写
readInts :: Int -> IO [Int]
readInts 0 = return []
readInts n = do
putStrLn("Enter a number: ")
numberString <- getLine
otherNumbers <- readInts (n-1) -- read the rest
return (read numberString : otherNumbers)
最后,我们可以直接使用结合了两者的getLine
而不是先使用read
然后再使用readLn
。
答案 1 :(得分:1)
使用构造一个整数列表
let l = map (\x -> read x::Int) (words "6 1 2 3 4 5 6")
in (numNumbers, numbers)
您试图将整个字符串读为一个数字。