type Matrix = [[Rational]] valid :: Matrix -> Bool valid xs = uniform [length x | x <- xs] && length xs >= 1
我试着测试一个矩阵是否至少有一行和一列,并且所有行的长度是否相同,但是当我在终端中输入“valid ”时,它输出为true。该语句有什么问题吗?
aurhwmvo1#
我假设uniform正在检查列表中的所有元素是否都相同。在xs = [[]]的情况下,[length x | x <- xs]的结果将是[0],这是一个所有元素都相同的列表。因此,您忽略了检查列表元素是否实际大于1。由于您已经检查了所有元素是否相同,因此您只需要检查第一个元素是否至少为1。请注意,您可能需要考虑条件的顺序。只有在确定列表中至少有一个元素时,才应该检查列表中第一个元素的属性。否则,如果给予[],可能会出错。
uniform
xs = [[]]
[length x | x <- xs]
[0]
[]
djmepvbi2#
您可以使用模式匹配来检查列表是否至少有一行,以及第一行是否至少有一列具有:
valid :: Matrix -> Bool valid xs@((_:_):_) = uniform (map length xs) valid _ = False
2条答案
按热度按时间aurhwmvo1#
我假设
uniform
正在检查列表中的所有元素是否都相同。在xs = [[]]
的情况下,[length x | x <- xs]
的结果将是[0]
,这是一个所有元素都相同的列表。因此,您忽略了检查列表元素是否实际大于1。由于您已经检查了所有元素是否相同,因此您只需要检查第一个元素是否至少为1。
请注意,您可能需要考虑条件的顺序。只有在确定列表中至少有一个元素时,才应该检查列表中第一个元素的属性。否则,如果给予
[]
,可能会出错。djmepvbi2#
您可以使用模式匹配来检查列表是否至少有一行,以及第一行是否至少有一列具有: