Consider:
data B = B !Int
data C = C !(B, B)
data D = D !B !B
b0 = B 7
b1 = B 4
c = C (b0, b1)
d = D b0 b1
Where
data (,) a b = (a,b)
GHC will gladly erase nested strict constructors (!B), and it will make C strict in its first field, optimizing:
b0 = B 7
b1 = B 4
c = C b0 b1
d = D 7 4
, , (,) , GHC . , , , .
- . , (, , ).
, - , . , .