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ó strictpor poco tiempo.
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, seseqhabí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.
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 ($!).
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.