Huella de memoria de los tipos de datos Haskell

¿Cómo puedo encontrar la cantidad real de memoria requerida para almacenar un valor de algún tipo de datos en Haskell (principalmente con GHC)? ¿Es posible evaluarlo en tiempo de ejecución (por ejemplo, en GHCi) o es posible estimar los requisitos de memoria de un tipo de datos compuesto a partir de sus componentes?

En general, si los requisitos de memoria de los tiposa yb se conocen, ¿cuál es la sobrecarga de memoria de los tipos de datos algebraicos como:

data Uno = Uno a
data Due = Due a b

Por ejemplo, ¿cuántos bytes en memoria ocupan estos valores?

1 :: Int8
1 :: Integer
2^100 :: Integer
\x -> x + 1
(1 :: Int8, 2 :: Int8)
[1] :: [Int8]
Just (1 :: Int8)
Nothing

Entiendo que la asignación de memoria real es mayor debido a la recolección de basura retrasada. Puede ser significativamente diferente debido a la evaluación diferida (y el tamaño del thunk no está relacionado con el tamaño del valor). La pregunta es, dado un tipo de datos, ¿cuánta memoria toma su valor cuando se evalúa por completo?

Encontré que hay un:set +s opción en GHCi para ver las estadísticas de memoria, pero no está claro cómo calcular la huella de memoria de un solo valor.

Respuestas a la pregunta(2)

Su respuesta a la pregunta