Я возился с матричными операциями (это было первое программирование, которое я когда-либо делал почти 20 лет go) и хотел воссоздать то, что я делал все это время go, но с более современными методами.
В любом случае ...
Одно из ограничений с матричными операциями состоит в том, что размер матриц, участвующих в операциях, имеет значение.
т.е. для сложения две матрицы должны быть из тот же размер. то есть M (i, j) + N (i, j). И умножение работает только в том случае, если количество столбцов в левой матрице совпадает с количеством строк в правой матрице и т. Д. c ...
Я искал способы применения этих ограничений. во время компиляции, но я не уверен, что это возможно.
Я знаю, что мог бы создать разные подтипы для каждого размера матрицы (Matrix1x1, Matrix1x2, Matrix2x3, ...), но их "довольно много" из них, так что это не стартер.
Я мог бы также использовать предварительное условие для функции, которая проверяет входные матрицы на правильные размеры, прежде чем что-либо делать (немного похоже на проверку индекса вне границ массива).
Но мне было интересно, был ли вообще способ применения size
матрицы к type
матрицы. Я не думаю, что слышал об этом раньше, но хотел проверить, прежде чем полностью выбросить идею.
Что-то похожее на то, когда я создаю матрицу, он применяет тот факт, что в этот момент он знает, какого размера матрица имеет.
Определение функции может выглядеть примерно так ...
func add(m: Matrix<i, j>, n: Matrix<i, j>) -> Matrix<i, j>
и
func multiply(m: Matrix<i, j>, n: Matrix<k, i>) -> Matrix<j, k>
// или что-то еще
Где i
и j
- это не общие ограничения типа c, а ограничения размера. Но это неверный синтаксис, просто дайте общее представление о том, что я думаю.