List 哪种模式与1x1矩阵匹配?
我正在写一个谓词来检查矩阵是否是(正方形)下三角形 如果第一行的所有元素(索引0处的元素除外)都为零,则的想法是返回true,然后再次调用子矩阵上的谓词,不包括1行和1列。当子矩阵只有1个数字(例如,[[x]])时,递归应该结束,这当然是下三角 问题:如何匹配[[x]],其中x只是一个数字List 哪种模式与1x1矩阵匹配?,list,haskell,matrix,pattern-matching,List,Haskell,Matrix,Pattern Matching,我正在写一个谓词来检查矩阵是否是(正方形)下三角形 如果第一行的所有元素(索引0处的元素除外)都为零,则的想法是返回true,然后再次调用子矩阵上的谓词,不包括1行和1列。当子矩阵只有1个数字(例如,[[x]])时,递归应该结束,这当然是下三角 问题:如何匹配[[x]],其中x只是一个数字 lowertriangular (???) = True lowertriangular (x:xs) = all (==0) (tail x) && lowertriangular (map
lowertriangular (???) = True
lowertriangular (x:xs) = all (==0) (tail x) && lowertriangular (map tail xs)
编辑:
m = [[1,0,0],[2,-3,0],[4,5,6]]
lt m = all (==0) [0, 0] && lt [[-3, 0], [5, 6]]
= all (==0) [0, 0] && (all (==0) [0] && lt [6])
lt[6]应该匹配返回True的[[[u]]。您可以使用模式
[[x]]
-或[[u]]
匹配[[x]]
,因为您实际上并不关心x
的值。即
lowertriangular [[_]] = True
使用1x1矩阵调用时将返回true
但是应该注意的是,1x1矩阵已经由case
lowertriangular(x:xs)=……
完美地处理过了,因此您不需要显式地处理它们。您需要处理的是一个空列表的情况,如下所示:
lowertriangular [] = True
您可以使用模式
[[x]]
-或[[[u]]]
匹配[[x]]]
,因为您实际上并不关心x
的值。即
lowertriangular [[_]] = True
使用1x1矩阵调用时将返回true
但是应该注意的是,1x1矩阵已经由case
lowertriangular(x:xs)=……
完美地处理过了,因此您不需要显式地处理它们。您需要处理的是一个空列表的情况,如下所示:
lowertriangular [] = True
也许这就是你想要的:
lowertriangular (x:[]) = True
lowertriangular (x:xs) = all (==0) (tail x) && lowertriangular (map tail xs)
也许这就是你想要的:
lowertriangular (x:[]) = True
lowertriangular (x:xs) = all (==0) (tail x) && lowertriangular (map tail xs)
@sepp2k:不,如果我使用[[\u]]我会得到“函数Lowertriangular中的非穷举模式”。@Gremo:之所以会这样,是因为你没有匹配列表为空的情况(即0x0矩阵)。但是你的问题是如何处理1x1矩阵,这就是答案。格雷莫:那可能是因为你的内部列表中除了一个元素之外还有其他元素(你只匹配一个元素列表)。sepp2k的答案仍然有效,但您还有其他问题。@sepp2k:请参阅第一篇文章中我的编辑。什么时候应该用空矩阵调用lowertriangular?@Gremo:对不起,我没在想。您需要处理的是一个包含空列表的列表的情况。@sepp2k:nope,如果我使用[[\u]]我会得到“函数lowertriangular中的非穷举模式”。@Gremo:您得到它是因为您不匹配列表为空的情况(即0x0矩阵)。但是你的问题是如何处理1x1矩阵,这就是答案。格雷莫:那可能是因为你的内部列表中除了一个元素之外还有其他元素(你只匹配一个元素列表)。sepp2k的答案仍然有效,但您还有其他问题。@sepp2k:请参阅第一篇文章中我的编辑。什么时候应该用空矩阵调用lowertriangular?@Gremo:对不起,我没在想。您需要处理的是得到一个包含空列表的列表的情况。在这个实现中,调用
lowertriangular[[1,0,0],[1,1,0,0],[1,1,1,0],[1,1,1,1],[1,1,1,1]。
会导致True
,而调用,e。g、 ,lowertriangular[[1,0,0,0],[1,1,0,1],[1,1,1,0],[1,1,1],[1,1,1,1],
结果为'False,因为第二行的最后一个元素是
1`(不是零)。当使用空矩阵调用时,它返回False
。@sepp2k:您的[]:xs
不是与现在的x:[]
相同吗?:-/@sepp2k:我是从实际的角度考虑这个问题的:-)没关系。在这个实现中,调用lowertriangular[[1,0,0],[1,1,0,0],[1,1,1,0],[1,1,1,1],[1,1,1,1],[1,1,1],[code>会导致True
,而调用e。g、 ,lowertriangular[[1,0,0,0],[1,1,0,1],[1,1,1,0],[1,1,1],[1,1,1,1],
结果为'False,因为第二行的最后一个元素是
1`(不是零)。当使用空矩阵调用时,它返回False
。@sepp2k:您的[]:xs
不是与现在的x:[]
相同吗?:-/@sepp2k:我是从实际的角度考虑这个问题的:-)没关系。