我正在尝试在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)
然而,当我尝试这个时,我只得到一个在每一行打印的函数,并且总是重复输入而不是总结它。如何修复它以便它只在末尾打印一个总和并正确添加。
答案 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)
函数sumF1
和sumF2
的定义似乎运行良好,可能问题在于您每次使用getInt
函数获取n
。
尝试添加此行以定义getInt
:
getInt = getLine >>= \n -> return (read n :: Int)
使用前奏中的getLine
。