
{-
main = do putStrLn (show (stupid_mul 100))
          putStrLn "100 multiplications done"

stupid_mul 0  = []
stupid_mul it = (s_mul it) : stupid_mul (it-1) -- without "it" after s_mul only one multiplication is executed
s_mul it = mul (replicate 4000 [0..3999])  (replicate 4000 2)

mul :: [[Double]] -> [Double] -> [Double]
mul [] _ = []
mul (b:bs) c | sp==0 = sp : (mul bs c) -- always false, force evaluation

                  | otherwise =  (mul bs c)

 where sp = (scalar b c)

scalar :: [Double] -> [Double] -> Double
scalar _ [] = 0
scalar [] _ = 0
scalar (v:vs) (w:ws) = (v*w) + (scalar vs ws)
-}

import Data.Array.Vector

n :: Int
n = 4000

main = print (sumU (zipWithU (*) a b))
  where
    a = replicateU n (2::Double)
    b = mapU (realToFrac::Int->Double) $ enumFromToU 0 (n-1)

