行列式 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を使ってみてもいいかなと思える。