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)?
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)?
Respuestas:
TL; DR: Miranda lo llamó seq
, se introdujo cuando sequence
(probablemente) ya era una cosa para las mónadas, y ($!)
se conoció strict
por poco tiempo.
Se llama seq
porque se llamó seq
en 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
seq
componentes estrictos de las estructuras de datos ya estaban presentes en Miranda por las mismas razones (Turner, 1985) y, de hecho, seseq
habí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 seq
sí 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, seq
era 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.
Ahora, ¿por qué no se llamó simplemente strict
a 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, sequence
no estaba disponible como nombre.
Ahora que sequence
estaba fuera de la imagen, echemos un vistazo strict
. strict
se incluyó en 1.3, ya que 1.3 introdujo una Eval
clase de tipo :
seq :: Eval a => a -> b -> b
strict :: Eval a => (a -> b) -> (a -> b)
strict f = \x -> seq x (f x)
Ni Eval
tampoco strict
hicieron el corte en Haskell98 tal como está. En cambio, Eval
se eliminó por completo, ya que se aplicaba a todos los tipos de cualquier manera, y strict
se le cambió el nombre ($!)
.
seq
, y 1.3 tiene una .ps
versió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.