Haskell - 继续添加用户输入int,直到遇到负数

时间:2015-11-28 09:09:55

标签: haskell

我正在尝试在Haskell中创建一个程序,它接受用户输入,添加每个输入行,并在用户输入一个负数(不包括负数的总和)时吐出最终总和,具体)。我尝试了

    sumF1 :: IO ()
    sumF1 = do
        totSum <- sumF2 0
        print totSum

    sumF2 :: Int -> IO Int
    sumF2 prev = do 
        n<-getInt
        if n<0
            then return prev
            else sumF2 (prev+n)

然而,当我尝试这个时,我只得到一个在每一行打印的函数,并且总是重复输入而不是总结它。如何修复它以便它只在末尾打印一个总和并正确添加。

4 个答案:

答案 0 :(得分:3)

  

我试图在Haskell中创建一个接受用户输入的程序,   添加每个输入行,并在用户后吐出最终总和   输入负数

如果这是你想要的唯一的东西,那么你可以简单地写

main = getContents >>= print . sum . takeWhile (>= 0) . map read . lines

否则你可以使用这个组合器

repeatWhile :: Monad m => (a -> Bool) -> m a -> m [a]
repeatWhile p a = do
    x <- a
    if p x
        then (x:) <$> repeatWhile p a
        else return []
像这样

main = repeatWhile (>= 0) readLn >>= print . sum

答案 1 :(得分:0)

尝试编写一个获取下一个数字的函数,并返回一个“IO(可能是整数)”,其中“Just”表示正输入,“Nothing”表示负数。然后在递归函数中使用它来创建整数列表(提示:其中一个参数将是到目前为止的整数列表)。然后在一个函数中使用它,它将列表中的所有整数相加。

答案 2 :(得分:0)

我认为它没有被破坏,但我不知道你对getInt的定义。对我来说,这个工作正常:

getInt :: IO Int
getInt = do str <- getLine
        return (read str)

取自here

答案 3 :(得分:0)

函数sumF1sumF2的定义似乎运行良好,可能问题在于您每次使用getInt函数获取n

尝试添加此行以定义getInt

getInt = getLine >>= \n -> return (read n :: Int)

使用前奏中的getLine