Por que a função de introdução ao rigor é chamada seq?

8

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)?

psquid
fonte
4
Eu acho que vem da "sequência", como em "avalie isso antes de avaliar isso". Se essa é a origem, é um nome muito enganador, pois não garante que o primeiro argumento seja avaliado antes do outro.
chi

Respostas:

8

TL; DR: Miranda chamou seq, foi introduzida quando sequence(provavelmente) já era uma coisa da Monads e ($!)era conhecida strictpor pouco tempo.

Miranda foi a primeira

É 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 fato seq, 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.

Outros nomes possíveis

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 ($!).

Zeta
fonte
1
Nota: reescrevi esta resposta várias vezes do zero sempre que encontrei uma nova fonte que esclareceu um pouco mais o assunto. Observe também que você perderá a sua sanidade mental se tentar executar as versões antigas do Haskell 1.0 e 1.1 através de um ambiente moderno do LaTeX. Felizmente, nenhum dos itens 1.0, 1.1 nem 1.2 incluídos 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.
Zeta