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?