Ответы до сих пор используют / эмулируют изменяемые типы данных, но как выглядит функциональный подход?
Чтобы увидеть, давайте разберем проблему на несколько функциональных компонентов:
GaussianИсключение включает в себя последовательность операций со строками, поэтому сначала полезно определить функцию, которая берет 2 строки и коэффициенты масштабирования и возвращает результирующий результат операции со строкой.
Операции со строками, которые нам нужны, должны исключать переменную (столбец)из определенной строки, поэтому давайте определим функцию, которая берет пару строк и индекс столбца и использует ранее определенную операцию строки, чтобы вернуть измененную строку с нулевой записью этого столбца.
Затем мы определяем две функции,один для преобразования матрицы в треугольную форму, а другой для обратной замены треугольной матрицы в диагональную форму (с использованием ранее определенных функций) путем исключения каждого столбца по очереди.Мы могли бы повторять или рекурсировать по столбцам, и матрица могла бы быть определена как список, вектор или массив списков, векторов или массивов.Входные данные не изменяются, но возвращается измененная матрица, так что мы можем, наконец, сделать:
let out_matrix = to_diagonal (to_triangular in_matrix);
Что делает его функциональным, не является ли данные-типы (массив или список) изменчивы, но как они используются.Этот подход может не быть особенно «умным» или самым эффективным для устранения гауссовских исключений в OCaml, но использование чистых функций позволяет четко выразить алгоритм.