¿De dónde obtiene su nombre la función Haskell `seq`?

8

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?

Daniel PP Cabral
fuente

Respuestas:

9

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.

a la izquierda
fuente
44
No creo que "si la expresión de la izquierda es ⊥, entonces la de la derecha no deba evaluarse". Vea wiki.haskell.org/Seq , por ejemplo, donde dice que una implementación legal de seq a bsería: "evaluar b, luego a, luego regresar b".
oisdk
@oisdk bueno, realmente no tiene sentido hablar de evaluación en absoluto; esto ni siquiera es una noción definida. El punto es que si aes ⊥, entonces a `seq` bno debe devolver el resultado de b.
Leftaroundabout
Por "evaluar" me refiero a "forzar la forma normal de la cabeza débil". Además, sigo pensando que su explicación no es correcta: podría devolver el resultado de 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.
oisdk
@oisdk pero "forzar" no es algo que Haskell sepa. - Sí, teóricamente, podría "devolver el resultado de 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.
Leftaroundabout
1
Claro, "forzar" no es un término que pueda usar para describir la semántica, pero tampoco lo es "evaluar", y estoy tratando de presentar una alternativa a las dos explicaciones que dio: "la cosa de la izquierda se evalúa para forma normal de la cabeza débil antes de que se evalúe el resultado de la derecha "," si la expresión de la izquierda es the, entonces no se debe evaluar la de la derecha ", lo que creo que están equivocados. Para una explicación precisa, diría " 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".
oisdk