-Wall
您可以通过打开带有标志的警告来向编译器询问丢失的情况。我强烈建议始终启用警告。对于您的代码,编译器报告:
example.hs:11:1: warning: [-Wincomplete-patterns]
Pattern match(es) are non-exhaustive
In an equation for `isMatrix':
Patterns not matched:
[]
([]:_:_)
([_]:_:_)
((_:_:_):_:_)
这些是您不处理的情况:
[]
空矩阵,没有行
[]:_:_
至少有两行的矩阵,第一行为空
[_]:_:_
至少有两行的矩阵,第一行只有一个元素
(_:_:_):_:_
至少有两行的矩阵,第一行至少有两个单元格
这是因为[x]
是长度为 1 的列表,在您的情况下是只有一行的矩阵x
。此外,[[x]]
是一个只有一行只有一个元素的矩阵x
(顺便说一下,不要对行和单元格使用相同的变量名称,这会造成混淆)。许多其他情况未指定。
请注意,即使在您处理的情况下,您的代码也是错误的:例如,isMatrix [[1,2,3,4,5]]
返回True
是因为它只有一行,但这不是矩阵。
有很多方法可以解决您的问题。您可以计算第一行的长度并检查所有其他行:
isMatrix [] = True
isMatrix (row1:rows) = allOfLength (length row) rows
where
allOfLength n rows = ....
或者,使用 预先计算所有行的长度map length
,然后检查结果列表是否由相同的数字组成,重复:
isMatrix mat = allEqual (map length mat)
where
allEqual lengths = ....