module Main where import List import System import Char import Int main :: IO () main = do args <- getArgs case args of [n] -> do putStrLn (show (matrixmult (atoi n))) where atoi s = foldl (\a d -> 10*a+d) 0 (map digitToInt s) a -> do putStrLn "Need one argument." exitWith (ExitFailure 1) type Matrix k = [Row k] type Row k = [k] genrow :: Int -> Double -> Double -> [Double] genrow n a d | n==0 = [] | otherwise = [a] ++ genrow (n-1) (a+d) d genmatrixpart :: Int -> Int -> Matrix Double genmatrixpart n m | n==m = [genrow m ((fromInt n)+1.5) 1] | otherwise = [genrow m ((fromInt n)+1.5) 1] ++ genmatrixpart (n+1) m genmatrix n = genmatrixpart 1 n matrixmultiply :: Matrix Double -> Double matrixmultiply a = sum (map sum [[row `dot` col | col<-a'] | row<-a]) where v `dot` w = sum (zipWith (*) v w) a' = transpose a matrixmult n = matrixmultiply (genmatrix n)