Haskell中Matrix的valid函数判断异常:输入[[]]返回True
问题分析与修复方案
你的valid函数目前只实现了两个校验条件:所有行的长度一致、矩阵至少包含一行,但缺少了“列数至少为1”的关键检查,这就是为什么valid [[]]会返回True。
为什么当前代码不符合预期?
当输入[[]]时:
[length x | x <- [[]]]生成列表[0],uniform [0]返回True(单个元素的列表天然满足长度均匀的要求)length [[]] >= 1的结果是True- 两个条件通过逻辑与结合后,最终返回
True,但[[]]是一个仅含一行、列数为0的矩阵,并不符合你“至少一行一列”的要求。
修复后的代码
你需要添加校验,确保每一行都不为空(即列数≥1)。由于已经通过uniform保证了所有行长度一致,直接校验所有行都非空即可:
type Matrix = [[Rational]] valid :: Matrix -> Bool valid xs = length xs >= 1 && uniform [length x | x <- xs] && all (not . null) xs
修复后的逻辑说明
length xs >= 1:确保矩阵至少包含一行uniform [length x | x <- xs]:确保所有行的长度相同(列数一致)all (not . null) xs:确保每一行都不为空(列数至少为1)
此时调用valid [[]]会返回False,符合你的预期。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

