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 seqpatrones / bang, la coincidencia de patrones y cualquier IOacción realizada a través de mainson 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. maines un punto de rigor. Está especialmente designado como el principal punto de rigor de su contexto: el programa. Cuando mainse 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 seqy 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? lety casedeclaraciones? 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?
sequna coincidencia de patrones es suficiente, con el resto definido en términos de esos. Creo que la coincidencia de patrones asegura el rigor de lasIOacciones, por ejemplo.