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\$

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.