Estoy comenzando Haskell y estaba buscando en algunas bibliotecas donde los tipos de datos se definen con "!". Ejemplo de la biblioteca ByteString:¿Cuál es el objetivo de la declaración de rigor?
data ByteString = PS {-# UNPACK #-} !(ForeignPtr Word8) -- payload
{-# UNPACK #-} !Int -- offset
{-# UNPACK #-} !Int -- length
Ahora vi this question como una explicación de lo que esto significa y supongo que es bastante fácil de entender. Pero mi pregunta es ahora: ¿de qué sirve usar esto? Dado que la expresión se evaluará siempre que sea necesario, ¿por qué obligarías a la evaluación temprana?
En la segunda respuesta a esta pregunta C.V. Hansen dice: "[...] a veces la sobrecarga de la pereza puede ser demasiado o un desperdicio". ¿Se supone que eso significa que se usa para ahorrar memoria (guardar el valor es más barato que guardar la expresión)?
¡Una explicación y un ejemplo serían geniales!
Gracias!
[EDIT] Creo que debería haber elegido un ejemplo sin {- # UNPACK # -}. Así que déjame hacer uno yo mismo. ¿Esto alguna vez tendría sentido? Es sí, ¿por qué y en qué situación?
data MyType = Const1 !Int
| Const2 !Double
| Const3 !SomeOtherDataTypeMaybeMoreComplex
La pereza puede tener un montón de impacto en el código, la principal es que los programas de perezosos a menudo corren en el espacio lineal cuando los estrictos necesitan espacio constante. Pero en su ejemplo, la verdadera razón probablemente tiene que ver con que los datos en cuestión sean manipulados por funciones externas que no saben cómo forzar evaluaciones vagas. –
No.El ForeignPtr se puede pasar a funciones externas, seguro, pero no a la estructura misma - incluso con anotaciones estrictas/desempaquetar no hay un ABI definido para las estructuras haskell nativas – bdonlan