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 strictpor pouco tempo.
É chamado seqporque foi chamado seqem 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
seqe 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 seqpró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, seqfazia 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 strictem 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, sequencenão estava disponível como um nome.
Agora que sequenceestava fora de cena, vamos dar uma olhada strict. strictfoi incluído no 1.3, já que o 1.3 introduziu uma Evalclasse de tipo :
seq :: Eval a => a -> b -> b
strict :: Eval a => (a -> b) -> (a -> b)
strict f = \x -> seq x (f x)
Nem Evalnem strictfez o corte em Haskell98 como está. Em vez disso, Evalfoi completamente removido, pois se aplicava a todos os tipos de qualquer maneira e strictfoi renomeado para ($!).
seqe o 1.3 possuem uma .psversã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.