3
\$\begingroup\$

I have written a code in Haskell that calculates the determinant of a matrix using the laplace expansion. As I have just started learning Haskell, I would like some opinions on how well (structured) the code is written and where I could be able to boost the performance.

This is the code:

det :: (Num a, Ord a) => [[a]] -> a
det [[]] = error "Cannot calculate Det from [[]]"
det x 
    | lfex /= lx                     = error "Cannot calculate Det from non square matrix"
    | lfex == 2 && (length s) == 2    = a*d - b*c
    | otherwise = foldl (\acc y -> let ind = index y in
                                      acc + (sign ind) * f!!ind * (det $ genLaplaceMatrix x ind)) 0 [0 .. lx-1]
    where 
          [[a,b],[c,d]] = x
          f:s:xr = x
          lx      = length x
          lfex    = length f
          sign y  = (-1)^(1+lx-y)
          index y = lx-1-y

--pivotrow = 1
--pivotcol 0 based!
genLaplaceMatrix :: (Num a) => [[a]] -> Int -> [[a]]
genLaplaceMatrix (_:x) pivotCol = foldr (\y -> (conVecs y:)) [] [0..((length x)-1)] 
    where
      parts vec = splitAt pivotCol vec
      conVecs row = let y = x!!row in (fst $ parts y) ++ (tail $ snd $ parts y)

It can also be found here.

I already looked at this question and tried to implement it as good as possible. Do you have any further advice?

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.