行列式 3

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

det:: (Num a) => [[a]] -> a
det [[x]] = x
det [[a, b], [c, d]] = a * d - b * c
det d = sum [s * head x * det (pmat i d) | (s, i, x) <- zip3 (cycle [1, -1]) [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

関数sig は、1と-1を交互に返すだけなので、わざわざ関数とするまでもないなと。zip3というのを見つけたので、これを使うことにした。トータルの実行時間は2.5秒程度にまで改善した。これくらい違うと、haskellを使ってみてもいいかなと思える。