-- !! Test strict, recursive newtypes
-- This test made a pre-5.02 fall over
-- Reason: the seq arising from the !F didn't see that
-- the represtation of F is a function.

-- NB It's crucial to compile this test *without* -O
-- The $ then prevents the 'F' from seeing the '\x'
-- and hence makes the evaluation happen at runtime

module Main ( main ) where

newtype F = F (Int -> Val)      -- NB: F and Val are
data Val = VFn !F |  VInt !Int  -- mutually recursive

f :: Val -> Val
f (VFn (F f)) = f 4

main = print (f (VFn (F $ (\x -> VInt (x+3)))))

instance Show Val where
  show (VInt n) = show n


