{-# LANGUAGE BangPatterns #-} module Main where data D = C { x :: !Int } deriving Show f :: Int -> D f 0 = C 0 f n = let !z = n + 1 in let !r = f z in let !(C {x = y }) = r in let !res = C { x = y } in res main :: IO () main = do putStrLn $ show $ f 0 putStrLn $ show $ f 1