我想写一个Haskell程序,从标准输入中读取一个正整数列表,如果用户写了一个不同的东西,如一个负数列表,一个字符列表或一个不是列表的东西,程序需要通知用户并从标准输入中再次读取,直到用户写了一个正确的列表。这是我写的,但如果用户键入一个包含字符的列表,或者一个单个数字/字符而没有用方括号把它括起来,程序结束。相反,如果用户键入一个包含负数的列表,或者空列表,程序工作得很好。谢谢你的建议。
main :: IO()
main = do
putStrLn "\nType a list of positive integers enclosed in square brackets and separated by commas:"
list <- readIntList
putStrLn "\nList:"
print list
readIntList :: IO [Double]
readIntList = do
readedList <- getLine
let list = read readedList
case checkList list && not (null list) of
True -> return list
False -> putStrLn "\nInvalid input, type again:" >> readIntList
checkList :: [Double] -> Bool
checkList = all checkNumber
checkNumber :: (Ord a, Num a) => a -> Bool
checkNumber n
| n > 0 = True
| otherwise = False
1条答案
按热度按时间06odsfpq1#
首先,让我们看看您的解决方案及其错误所在。错误会用注解标记。
现在,我们知道了您的实现中存在的问题,让我们来解决它
出于完整性的考虑,最后一个模式匹配可以使用guard来简化,但这不是已知的语法