Haskell技术问题:预期含2个元素的发送方法列表为空
解决Haskell列表为空的问题
看起来你的代码里有几个可能导致列表为空的点,我来一步步帮你排查:
1. 惰性IO的潜在问题
你手动打开和关闭文件的方式可能踩了Haskell惰性IO的坑:hGetContents是惰性读取的,虽然你在mapM_ print polygons之后才调用hClose,但求值时机的问题可能导致文件还没完全读取就被关闭,进而singlewords为空,最终list也为空。
解决方法是用readFile代替手动管理文件句柄,它会自动处理打开和关闭,避免这类问题:
main :: IO () main = do contents <- readFile "polycake.in" let singlewords = words contents list = fileToList singlewords n = head list list' = drop 1 list polygons = polyList n list' mapM_ print polygons
2. 不安全的head调用
如果list为空,head list会直接抛出运行时错误,而且你没法提前定位问题。建议用模式匹配来安全处理:
main :: IO () main = do contents <- readFile "polycake.in" let singlewords = words contents list = fileToList singlewords case list of [] -> putStrLn "Error: Parsed list is empty! Check your input file." (n:list') -> do let polygons = polyList n list' mapM_ print polygons
3. 补全polyList的逻辑
你提供的polyList代码不完整(let poi...中断了),这很可能是导致最终polygons为空的关键。假设你的Polygon类型是由坐标点组成的,比如:
data Polygon = Polygon [(Int, Int)] deriving (Show)
那一个合理的polyList实现应该是这样的(假设每个多边形需要n个点,每个点占两个整数坐标):
polyList :: Int -> [Int] -> [Polygon] polyList _ [] = [] polyList n coords = if length coords >= 2 * n then let (pointValues, rest) = splitAt (2*n) coords points = makePairs pointValues in Polygon points : polyList n rest else error "Not enough coordinates left to form a polygon" where makePairs [] = [] makePairs (x:y:xs) = (x, y) : makePairs xs makePairs [_] = error "Odd number of coordinate values"
4. 调试输出确认输入
你可以在代码里加一些调试输出,看看singlewords和list的实际内容,确认输入文件是否符合预期:
main :: IO () main = do contents <- readFile "polycake.in" let singlewords = words contents putStrLn $ "Raw words from file: " ++ show singlewords let list = fileToList singlewords putStrLn $ "Parsed integer list: " ++ show list -- 后续逻辑...
内容的提问来源于stack exchange,提问作者jaMAN
相关产品推荐
相关产品推荐

