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]
          [[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)] 
      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?


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.