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

Haskell-继续添加用户输入int,直到遇到负值,haskell,Haskell,我试图在Haskell中创建一个程序,它接收用户输入,将每个输入行相加,并在用户输入负数(具体来说,总数不包括负数)后吐出最终的总和。我尝试 sumF1 :: IO () sumF1 = do totSum <- sumF2 0 print totSum sumF2 :: Int -> IO Int sumF2 prev = do n<-getInt if n<0

我试图在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)
sumF1::IO()
sumF1=do
总积分
sumF2 prev=do

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

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

我不认为它是坏的,但我不知道您对getInt的定义。对我来说,这个很好用:

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

我不认为它坏了,但我不知道你对getInt的定义。对我来说,这个很好用:

getInt :: IO Int
getInt = do str <- getLine
        return (read str)
getInt::IO Int
getInt=do str
我试图在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 []
我试图在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 []

函数
sumF1
sumF2
的定义似乎工作得很好,问题可能在于每次用于获取
n
getInt
函数

尝试为
getInt
的定义添加此行:

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

它使用了前奏曲中的
getLine

函数
sumF1
sumF2
的定义似乎工作得很好,可能问题在于每次用于获取
n
getInt
函数

尝试为
getInt
的定义添加此行:

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

它使用前奏曲中的
getLine

该代码的可能重复项与您描述的相同(假设
getInt::IO Int;getInt=fmap read getLine
或等效项)。您可能没有向我们显示所有代码,或者您正在尝试执行其他操作。该代码的可能重复项与您描述的相同(假设
getInt::IO Int;getInt=fmap read getLine
或等效项)。要么你没有向我们展示你所有的代码,要么你试图做其他事情。你的消息来源说,
getLine
是由前奏提供的,而不是
getInt
。前奏曲中没有
getInt
。你可以写得更简洁:
getInt=getLine>>=read
。显然它仍然需要类型签名。您的消息来源说,
getLine
是由prelude提供的,而不是
getInt
。前奏曲中没有
getInt
。你可以写得更简洁:
getInt=getLine>>=read
。显然,它仍然需要类型签名。这也是我正在使用的实现。我的代码仍然存在问题,它将每一行作为输入,并将每一行打印回给我(有点像回音),而不是实际正常运行。这也是我正在使用的实现。我的代码仍然存在一些问题,它将每一行作为输入,并将每一行打印回给我(有点像回音),而不是实际正常运行