Todos sabemos (o deberíamos saber) que Haskell es vago por defecto. Nada se evalúa hasta que deba evaluarse. Entonces, ¿cuándo se debe evaluar algo? Hay puntos en los que Haskell debe ser estricto. A estos los llamo "puntos de rigor", aunque este término en particular no está tan extendido como había pensado. Según yo:
La reducción (o evaluación) en Haskell solo ocurre en puntos de rigor.
Entonces la pregunta es: ¿cuáles son, precisamente , los puntos de rigor de Haskell? Mi intuición dice que main
, los seq
patrones / bang, la coincidencia de patrones y cualquier IO
acción realizada a través de main
son los puntos de rigor primarios, pero realmente no sé por qué lo sé.
(También, si no son llamados "puntos de rigurosidad", lo que se llaman?)
Imagino que una buena respuesta incluirá alguna discusión sobre WHNF, etc. También imagino que podría tocar el cálculo lambda.
Editar: pensamientos adicionales sobre esta pregunta.
Como he reflexionado sobre esta pregunta, creo que sería más claro agregar algo a la definición de un punto de rigor. Los puntos de rigor pueden tener distintos contextos y una profundidad (o rigor) variable . Volviendo a mi definición de que "la reducción en Haskell solo ocurre en puntos de rigor", agreguemos a esa definición esta cláusula: "un punto de rigor solo se activa cuando su contexto circundante es evaluado o reducido".
Entonces, déjeme tratar de comenzar con el tipo de respuesta que quiero. main
es un punto de rigor. Está especialmente designado como el principal punto de rigor de su contexto: el programa. Cuando main
se evalúa el contexto del programa , se activa el punto de rigor de main. La profundidad de Main es máxima: debe evaluarse completamente. Main suele estar compuesto por acciones IO, que también son puntos de rigurosidad, cuyo contexto es main
.
Ahora intente: discuta seq
y empareje patrones en estos términos. Explique los matices de la aplicación de funciones: ¿cómo es estricta? ¿Cómo no es así? ¿Qué hay de deepseq
? let
y case
declaraciones? unsafePerformIO
? Debug.Trace
? ¿Definiciones de nivel superior? ¿Tipos de datos estrictos? ¿Patrones de explosión? Etc. ¿Cuántos de estos elementos se pueden describir en términos de coincidencia de patrones o secuencias?
seq
una coincidencia de patrones es suficiente, con el resto definido en términos de esos. Creo que la coincidencia de patrones asegura el rigor de lasIO
acciones, por ejemplo.