exclude n l = take n l ++ drop (succ n) l -- возвращает список `l' без `n'-го элемента minor n m = exclude 0 $ map (exclude n) m -- возвращает матрицу `m' без `n'-го столбца и первой строки det [[]] = 0 -- определитель пустой матрицы 0 det [[x]] = x -- определитель матрицы из одного элемента равен ему det m@(x:xs) = sum $ zipWith (*) (zipWith (*) x factors) $ map det minors -- суммировать все произведения (произведений элементов первой строки на [1,-1,1,-1..]) на определители доп. миноров where factors = concat $ repeat [1,-1] -- список вида [1,-1,1,-1..] minors = map (flip minor m) [0..] -- список всех доп. миноров