blob: bbc3d1196090525bbf42c2cdf7d0dbf24a18a0a6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
-- !! 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
|