A menos que usted está almacenando una gran cálculo en el Int y flotar campos, sobrecarga significativa se puede construir a partir de una gran cantidad de cálculos triviales se acumulan en los procesadores sencillos. Por ejemplo, si agrega repetidamente 1 a un campo Float perezoso en un tipo de datos, usará más y más memoria hasta que fuerce el campo y lo calcule.
A menudo, desea almacenar costosos cálculos en un campo. Pero si sabe que no hará algo así antes de tiempo, puede marcar el campo de manera estricta y evitar tener que agregar manualmente seq
en todas partes para obtener la eficiencia que desea.
Como un beneficio adicional, cuando se les da la bandera -funbox-strict-fields
GHC desempacamos campos estrictas de tipos de datos directamente en el mismo tipo de datos, que es posible, ya que sabe que siempre serán evaluados, y por lo tanto no hay golpe seco tiene que ser asignado; en este caso, un valor de Bar contendría las palabras de la máquina que comprenden el Int y Float directamente dentro del valor de la Barra en la memoria, en lugar de contener dos punteros a los thunk que contienen los datos.
La pereza es una cosa muy útil, pero algunas veces se interpone en el camino e impide el cálculo, especialmente para campos pequeños que siempre se miran (y por lo tanto forzados) o que se modifican a menudo pero nunca con cálculos muy caros Los campos estrictos ayudan a superar estos problemas sin tener que modificar todos los usos del tipo de datos.
si es más común que los campos perezosos o no depende del tipo de código que está leyendo; no es probable que veas estructuras arbóreas funcionales que usen campos estrictos extensivamente, por ejemplo, porque se benefician enormemente de la pereza.
Digamos que usted tiene un AST con un constructor para las operaciones de infijos:
data Exp = Infix Op Exp Exp
| ...
data Op = Add | Subtract | Multiply | Divide
que no le gustaría hacer las Exp
campos estricta, como la aplicación de una política como eso significaría que se evalúa todo el AST cada vez que mira el nodo de nivel superior, que claramente no es lo que quiere beneficiarse de la pereza. Sin embargo, el campo Op
nunca contendrá un cálculo costoso que desee posponer para una fecha posterior, y la sobrecarga de un procesador por procesador puede ser costosa si tiene árboles de análisis anidados muy anidados. Por lo tanto, para el constructor infijo, querrá hacer que el campo Op
sea estricto, pero deje los dos campos Exp
vagos.
Solo se pueden desempacar los tipos de un solo constructor.
¿Al igual que los AST no deberían ser tan estrictos? – Lanbo
He ampliado mi respuesta con cierta elaboración usando AST como ejemplo. – ehird