如何在Haskell中读取/添加/打印数字字符串

时间:2018-11-30 19:05:12

标签: haskell

下面是我的代码。我希望能够接受如下所示的用户输入:“ 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

2 个答案:

答案 0 :(得分:3)

似乎您需要一个辅助的递归函数来读取num整数,或者需要像replicateM这样的助手,这使得编写代码变得更加容易。

replicateM num action精确运行actionnum次,并将所有操作结果收集到一个列表中。

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)

您试图将整个字符串读为一个数字。