Я серьезно изучал Хаскель уже около полутора недель и черпал вдохновение в занятиях по линейной алгебре, чтобы сделать решатель матриц. Первым шагом является создание определяющей функции, но я хотел пройти лишнюю милю и создать функцию, которая могла бы решать матрицы более высокой размерности (4x4, 5x5 и т. Д.).
Я очень горжусь тем, что у меня есть, учитывая, что это все, что я выучил, и я смог устранить все ошибки, с которыми я столкнулся до этого момента, благодаря компилятору Haskell. Однако именно в этот момент я в растерянности. Код ниже будет скомпилирован в GHCI без проблем:
elerem :: Int -> [a] -> [a]
elerem x xs = init first ++ sec
where
first = fst split
sec = snd split
split = splitAt x xs
neglist :: Num a => [a] -> [a]
neglist (x:y:rest) = x:(negate y):(neglist rest)
neglist [x] = [x]
determin :: (Num a, Enum a) => [[a]] -> a
determin xf
|length (head xf) /= length xf = 0
|(length xf == 2) && (length (head xf) == 2) = cofactor xf
|otherwise = sum (zipWith (*) (neglist (head xf)) (sizedown xf))
where
sizedown xf = [(determin (cut (tail xf) 1)), (determin (cut (tail xf) 2))..(determin (cut (tail xf) (length xf)))]
cut xf x = map (elerem x) xf
cofactor xf = head (head xf) * last (last xf) - head (last xf) * last (head xf)
И из моего тестирования пока успешно работает с матрицей 2x2 и некоторыми, но не всеми, матрицами 3x3. Поскольку я на самом деле не получаю никаких сообщений об ошибках, я не уверен, где именно я ошибся в коде, все, что я вижу, это то, что мой код не дает те же ответы, что матричные калькуляторы в Интернете.
Моя единственная подсказка заключается в том, что при запуске с матрицы идентификаторов 3x3 мой код выполняет очень очевидный ответ 1. Изменение значений элементов в матрице идентификаторов также изменяет ответ на правильный, за исключением первого значения (или столбцов). второй и третьей матрицы (или строки). Похоже, что первый намеренно путает ответы, а последний игнорируется при расчете и рассматривается как 0.
Я чувствую, что решить эту проблему будет сложнее, чем обычно, из-за отсутствия полезных сообщений об ошибках, и я еще не достаточно опытен, чтобы представить себе процесс расширения функций, выполняющийся в моей голове, чтобы найти точный центр проблемы. Любая помощь будет принята с благодарностью.