Edited to correct some of the details of re: quads, consisting of 8 bytes and explaining the static link field.
I think unsafeSizeOf is inaccurate and you are misinterpreting its output. Please note that it is intended to display memory usage only for closing the top level, and not for general use of the object space. What you see, I think, is that q requires 10 bytes in addition to the tuple p (while p requires 10 bytes in addition to the Char box and in the Int box). Moreover, my tests show that top-level constructors actually require 24 bytes each (in a 64-bit architecture), although unsafeSizeOf reports 10 for me too.
In particular, if I compile the following test program using stack ghc -- -fforce-recomp -ddump-asm -dsuppress-all -O2 ZeroMemory.hs using GHC 8.0.2:
{-
then the memory size for closing the top level q as follows:
q_closure: .quad Uncurry_static_info .quad $s$WUncurry_$d~~_closure+1 .quad q1_closure+1 .quad 3
Note that each .quad here is actually 8 bytes; it is a “quad” of 16-bit “old words” of the old style. I believe that the final quad here with a value of 3 is the "static link field" described in the commentary on the GHC implementation and, t apply to the "typical" heap distribution objects.
Thus, ignoring this final field, the total closing size of the top level q is 24 bytes, and it refers to q1_closure , which is the contained tuple:
q1_closure: .quad (,)_static_info .quad q3_closure+1 .quad q2_closure+1 .quad 3
for another 24 bytes.
The closures q2 and q3 are plug-in Int and Char and therefore occupy two squares (16 bytes each). So q takes up a total of 10 quads or 80 bytes. (I included r as a health check to make sure that I did not mistakenly identify any general information.)
A p tuple itself will have a memory size equivalent to q1_closure , so 7 quads or 56 bytes.