Entendo a função seq e por que é necessário introduzir rigor na eficiência. O que eu não entendo é: por que esse primitivo é chamado seq
(e não tem a ver com rigor)?
Entendo a função seq e por que é necessário introduzir rigor na eficiência. O que eu não entendo é: por que esse primitivo é chamado seq
(e não tem a ver com rigor)?
Respostas:
TL; DR: Miranda chamou seq
, foi introduzida quando sequence
(provavelmente) já era uma coisa da Monads e ($!)
era conhecida strict
por pouco tempo.
É chamado seq
porque foi chamado seq
em Miranda e nos idiomas anteriores, pelo menos de acordo com A History of Haskell: Being Lazy With Class de Paul Hudak, John Hughes, Simon Peyton Jones e Philip Wadler .
Ambos
seq
e componentes estritos das estruturas de dados já estavam presentes em Miranda pelas mesmas razões (Turner, 1985) e, de fatoseq
, foram usados para corrigir vazamentos de espaço em programas preguiçosos desde o início dos anos 80 (Scheevel, 1984; Hughes, 1983).
Observe que Turner apenas introduziu os componentes estritos no artigo de 1985 , e não o seq
próprio, e o "manual NORMA Sasl" de Scheevel parece estar perdido ou pelo menos não disponível na Internet. A tese de Hughes ("Hughes, 1983" acima) também não é apresentada seq
.
De qualquer forma, seq
fazia parte do ambiente padrão do Mirandas e também contém uma dica de por que foi chamado seq
:
`seq 'aplicado a dois valores, retorna o segundo, mas verifica se o primeiro valor não está completamente indefinido. Às vezes é necessário, por exemplo, para garantir a sincronização correta em programas interativos.
Sincronização correta ou seq uencing.
Agora, por que isso simplesmente não foi chamado strict
em Haskell? Ou mesmo sequence
?
Bem, acontece que Haskell 1.3 , que introduziu seq
, também introduziu Monad
, e assim sequence :: Monad m => [m a] -> m ()
. Portanto, sequence
não estava disponível como um nome.
Agora que sequence
estava fora de cena, vamos dar uma olhada strict
. strict
foi incluído no 1.3, já que o 1.3 introduziu uma Eval
classe de tipo :
seq :: Eval a => a -> b -> b
strict :: Eval a => (a -> b) -> (a -> b)
strict f = \x -> seq x (f x)
Nem Eval
nem strict
fez o corte em Haskell98 como está. Em vez disso, Eval
foi completamente removido, pois se aplicava a todos os tipos de qualquer maneira e strict
foi renomeado para ($!)
.
seq
e o 1.3 possuem uma .ps
versão adequada e HTML à mão. Se você quiser ver por que a E / S monádica foi celebrada, procure o [Request] -> [Response]
modelo de E / S antigo . Ser preguiçoso com a classe provavelmente é o melhor recurso para procurar além, além das antigas atas das reuniões.