-- Compile with O2; SpecConstr should fire nicely -- and eliminate all allocation in inner loop module Main where foo :: Int -> Maybe (Double,Double) -> Double foo _ Nothing = 0 foo 0 (Just (x,y)) = x+y foo n (Just (x,y)) = let r = f x y in r `seq` foo (n-1) (Just r) where f x y | x <= y = (x,y) | otherwise = (y,x) main = print (foo 1000000 (Just (1,2)))