Моя программа (Hartree-Fock/iterative SCF) имеет две матрицы F и F ', которые действительно являются той же матрицей, выраженной в двух разных базах. Я просто потерял три часа отладки, потому что случайно использовал F 'вместо F. В С++ тип-checker не обнаруживает эту ошибку, поскольку обе переменные являются объектами Eigen::Matrix<double, 2, 2>
.
Мне было интересно, для Haskell/ML/etc. люди, если бы вы писали эту программу, вы бы построили систему типов, где F и F 'имели разные типы? Как это будет выглядеть? Я в основном пытаюсь понять, как я могу передать некоторые логические ошибки на проверку типов.
Редактирование: основа матрицы похожа на единицу. Вы можете сказать 1L или хотя бы несколько галлонов, они оба означают одно и то же. Или, чтобы дать векторный пример, вы можете сказать (0,1) в декартовых координатах или (1, pi/2) в полярности. Но даже при том, что смысл одинаков, числовые значения разные.
Изменить: Возможно, единицы были неправильной аналогией. Я не ищу какой-то тип записи, где я могу указать, что первое поле будет литером и вторым галлоном, а скорее способом сказать, что эта матрица в целом определена в терминах некоторой другой матрицы ( базис), где базис может быть любой матрицей одинаковых размеров. Например, конструктор будет выглядеть примерно как mkMatrix [[1, 2], [3, 4]] [[5, 6], [7, 8]]
, а затем добавив, что объект к другой матрице будет проверять тип, только если оба объекта имеют ту же матрицу, что и их второй параметр. Это имеет смысл?
Изменить: определение Wikipedia, обработанные примеры