¿Por qué la función de introducción de rigurosidad se llama seq?

8

Entiendo la función seq y por qué es necesario introducir rigurosidad para la eficiencia. Lo que no entiendo es, ¿por qué se llama a esta primitiva seq(y no a algo estricto)?

psquid
fuente
44
Supongo que proviene de "secuencia" como en "evaluar esto antes de evaluar eso". Si este es el origen, es un nombre muy engañoso, ya que no garantiza que el primer argumento se evalúe antes que el otro.
chi

Respuestas:

8

TL; DR: Miranda lo llamó seq, se introdujo cuando sequence(probablemente) ya era una cosa para las mónadas, y ($!)se conoció strictpor poco tiempo.

Miranda fue primero

Se llama seqporque se llamó seqen Miranda y en idiomas anteriores, al menos según A History of Haskell: Being Lazy With Class por Paul Hudak, John Hughes, Simon Peyton Jones y Philip Wadler .

Los seqcomponentes estrictos de las estructuras de datos ya estaban presentes en Miranda por las mismas razones (Turner, 1985) y, de hecho, se seqhabían utilizado para corregir fugas de espacio en programas perezosos desde principios de la década de 1980 (Scheevel, 1984; Hughes, 1983)

Tenga en cuenta que Turner solo introdujo los componentes estrictos en el documento de 1985 , no en seqsí mismo, y el "manual Sasl NORMA" de Scheevel parece haberse perdido o al menos no está disponible en Internet. La tesis de Hughes ("Hughes, 1983" arriba) tampoco presenta seq.

De cualquier manera, seqera parte del entorno estándar de Mirandas y también contiene una pista de por qué se llamaba seq:

'seq' aplicado a dos valores, devuelve el segundo pero verifica que el primer valor no esté completamente indefinido. A veces es necesario, por ejemplo, para garantizar una sincronización correcta en programas interactivos.

La sincronización correcta o SEC uir.

Otros posibles nombres

Ahora, ¿por qué no se llamó simplemente stricta Haskell? O incluso sequence?

Bueno, resulta que Haskell 1.3 , que introdujo seq, también introdujo Monad, y por lo tanto sequence :: Monad m => [m a] -> m (). Por lo tanto, sequenceno estaba disponible como nombre.

Ahora que sequenceestaba fuera de la imagen, echemos un vistazo strict. strictse incluyó en 1.3, ya que 1.3 introdujo una Evalclase de tipo :

seq :: Eval a => a -> b -> b
strict :: Eval a => (a -> b) -> (a -> b)
strict f = \x -> seq x (f x)

Ni Evaltampoco stricthicieron el corte en Haskell98 tal como está. En cambio, Evalse eliminó por completo, ya que se aplicaba a todos los tipos de cualquier manera, y strictse le cambió el nombre ($!).

Zeta
fuente
1
Nota: Reescribí esta respuesta varias veces desde cero cada vez que me encontré con una nueva fuente que arrojó un poco más de luz sobre el tema. También tenga en cuenta que perderá su cordura si intenta ejecutar las antiguas versiones Haskell 1.0 y 1.1 a través de un entorno moderno de LaTeX. Afortunadamente, ninguno de 1.0, 1.1 ni 1.2 incluido seq, y 1.3 tiene una .psversión adecuada y HTML a la mano. Si desea ver por qué se celebró la E / S monádica, busque el antiguo [Request] -> [Response]modelo de E / S. Ser perezoso con clase es probablemente el mejor recurso para mirar más allá, aparte de las viejas actas de las reuniones.
Zeta