Какой шаблон будет соответствовать матрице 1x1? - PullRequest
1 голос
/ 03 февраля 2011

Я пишу предикат, чтобы проверить, является ли матрица (квадратная) нижняя треугольная .

Идея заключается в возвращении true если все элементы первой строки (кроме элемента с индексом 0) равны нулю, а затем снова вызвать предикат для подматрицы , полученный , исключая 1 строка и 1 столбец.Рекурсия должна заканчиваться, когда подматрицей является всего 1 число (например, [[x]]), которое, конечно, является нижней треугольной.

Вопрос: как я могу сопоставить [[x]], где x это просто число?

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.

Ответы [ 2 ]

5 голосов
/ 03 февраля 2011

Вы можете сопоставить [[x]], используя шаблон [[x]] - или [[_]], так как на самом деле вам не важно значение x.Т.е.

lowertriangular [[_]] = True

вернет true при вызове с матрицей 1x1.


Однако следует отметить, что матрицы 1x1 уже отлично обрабатываются в случае lowertriangular (x:xs) = ...Вам не нужно обращаться с ними явно.То, что вам нужно обработать, это случай, когда вы получаете пустой список, например:

lowertriangular [] = True
1 голос
/ 03 февраля 2011

Может быть, это то, что вы ищете:

lowertriangular (x:[]) = True
lowertriangular (x:xs) = all (==0) (tail x) && lowertriangular (map tail xs)
...