Haskell-继续添加用户输入int,直到遇到负值
我试图在Haskell中创建一个程序,它接收用户输入,将每个输入行相加,并在用户输入负数(具体来说,总数不包括负数)后吐出最终的总和。我尝试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
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
。显然,它仍然需要类型签名。这也是我正在使用的实现。我的代码仍然存在问题,它将每一行作为输入,并将每一行打印回给我(有点像回音),而不是实际正常运行。这也是我正在使用的实现。我的代码仍然存在一些问题,它将每一行作为输入,并将每一行打印回给我(有点像回音),而不是实际正常运行