Entiendo que seqse usa para mejorar el rendimiento al evitar la pereza innecesaria. ¿Solo quiero saber de dónde se deriva el nombre? ¿Es de "secuencia" o "secuencial"? ¿Y cómo se relaciona el nombre con la evaluación estricta?
Entiendo que seqse usa para mejorar el rendimiento al evitar la pereza innecesaria. ¿Solo quiero saber de dónde se deriva el nombre? ¿Es de "secuencia" o "secuencial"? ¿Y cómo se relaciona el nombre con la evaluación estricta?
Respuestas:
Viene del punto de secuencia . Ese es un concepto bien conocido en C, y de hecho es bastante similar al seqoperador en Haskell: cada cálculo a la izquierda debe hacerse antes de cualquier cálculo a la derecha .
Por supuesto, Haskell seqes un poco menos exigente que eso: simplemente solicita que la cosa de la izquierda se evalúe en forma normal de cabeza débil antes de evaluar el resultado de la derecha. Y realmente no garantiza ningún orden de evaluación en particular † , solo que si la expresión de la izquierda es ⊥, entonces la de la derecha no debe evaluarse.
Vea pseqo deepseqpara alternativas más fuertes, que se acercan a lo que C llama puntos de secuencia.
† En realidad, los puntos de secuencia C o C ++ tampoco garantizan el orden de cálculo, solo que los efectos secundarios están en el orden correcto. Pero, en C, los efectos secundarios son omnipresentes, por lo que, aparte de las optimizaciones de bajo nivel, generalmente se puede suponer que se mantendrá el orden de los puntos de secuencia, mientras que GHC de hecho se seqdescartará con frecuencia si solo se sabe que las expresiones no divergen.
aes ⊥, entonces a `seq` bno debe devolver el resultado de b.
bsi lo fuera ⊥. Creo que decir que está garantizando bque no será "evaluado" (o examinado) en ningún sentido es engañoso, e incluso prácticamente incorrecto (y creo que es la diferencia central con pseq). Creo que "forzar el resultado de seq a bnecesariamente fuerzas ay seq a b = bcuándo a != ⊥" es más preciso.
bsi lo fuera ⊥", eso sería algo que al menos tiene sentido decir, en Haskell, sin referirse a ninguna implementación. Sólo, no se podía realmente hacer esto, en general, - porque requeriría primera proving que bes ⊥, y para eso se necesita para resolver problema de la parada del tha.
seq a b = bcuándo a != ⊥", y luego para describir cómo realmente tiende a funcionar en GHC, diría "forzar el resultado de seq a bnecesariamente fuerzas a".
seq a bsería: "evaluarb, luegoa, luego regresarb".