haskell版 行列式

import System.Random


randomList :: Random a => a -> a -> IO [a]
randomList a b = fmap (randomRs (a, b)) newStdGen

pmat :: Int -> [[a]] -> [[a]]
pmat n d = [tail x | x <- left ++ tail right]
    where (left, right) = splitAt n d

sig :: (Integral a, Num b) => a -> b
sig a = if mod a 2 == 0 then 1 else -1

det:: (Num a) => [[a]] -> a
det [[x]] = x
det [[a, b], [c, d]] = a * d - b * c
det d = sum [(sig i) * head x * det (pmat i d) | (i, x) <- zip [0..] d]

getMat :: (Num a) => Int -> [a] -> [[a]]
getMat _ [] = []
getMat n x = [take n x] ++ getMat n (drop n x)

main = do
    hoge <- randomList 1 9 :: (IO [Int])
    let n = 10
    let d = getMat n $ take (n^2) hoge
    print d
    print $ det d

haskellのリストはリンクリストなんで、 x !! i みたいなアクセスは時間がかかるらしい。
それで、!!関数を使わないようにしてみた。