Entiendo que seq
se 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?
Viene del punto de secuencia . Ese es un concepto bien conocido en C, y de hecho es bastante similar al seq
operador en Haskell: cada cálculo a la izquierda debe hacerse antes de cualquier cálculo a la derecha .
Por supuesto, Haskell seq
es 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 pseq
o deepseq
para 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 seq
descartará con frecuencia si solo se sabe que las expresiones no divergen.
seq a b
sería: "evaluarb
, luegoa
, luego regresarb
".a
es ⊥, entoncesa `seq` b
no debe devolver el resultado deb
.b
si lo fuera⊥
. Creo que decir que está garantizandob
que no será "evaluado" (o examinado) en ningún sentido es engañoso, e incluso prácticamente incorrecto (y creo que es la diferencia central conpseq
). Creo que "forzar el resultado deseq a b
necesariamente fuerzasa
yseq a b = b
cuándoa != ⊥
" es más preciso.b
si 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 queb
es⊥
, y para eso se necesita para resolver problema de la parada del tha.seq a b = b
cuándoa != ⊥
", y luego para describir cómo realmente tiende a funcionar en GHC, diría "forzar el resultado deseq a b
necesariamente fuerzasa
".