De onde vem a função Haskell `seq`?

8

Entendo que isso seqé usado para melhorar o desempenho, evitando a preguiça desnecessária. Eu só quero saber de onde o nome é derivado? É de "sequência" ou "sequencial"? E como o nome está relacionado à avaliação rigorosa?

Daniel PP Cabral
fonte

Respostas:

9

Vem do ponto de sequência . Esse é um conceito bem conhecido em C e, de fato, bastante semelhante ao seqoperador em Haskell: todo cálculo à esquerda deve ser feito antes de qualquer cálculo à direita .

Obviamente, Haskell seqé um pouco menos exigente do que isso: apenas solicita que a coisa à esquerda seja avaliada para uma forma normal de cabeça fraca antes que o resultado à direita seja avaliado. E isso realmente não garante nenhuma ordem de avaliação específica , apenas que, se a expressão à esquerda for ⊥, a expressão à direita não deverá ser avaliada.

Veja pseqou deepseqalternativas mais fortes, que se aproximam do que C chama de pontos de sequência.


Na verdade, os pontos de sequência C ou C ++ também não garantem a ordem de computação, apenas que quaisquer efeitos colaterais estejam na ordem correta. Mas, em C, os efeitos colaterais são onipresentes; portanto, além das otimizações de baixo nível, você geralmente pode assumir que a ordem dos pontos de sequência será mantida, enquanto o GHC de fato jogará seqfora se souber que as expressões não divergem.

leftaroundabout
fonte
4
Não acho que "se a expressão da esquerda for ⊥, a da direita não deve ser avaliada". Veja wiki.haskell.org/Seq , por exemplo, onde ele diz que uma implementação legal de seq a bseria: "Avaliar b, em seguida a, em seguida, retornar b".
oisdk 24/01
@oisdk bem, não faz muito sentido falar sobre avaliação - essa nem é uma noção definida. O ponto é que, se afor ⊥, a `seq` bnão deve retornar o resultado de b.
leftaroundabout
Por "avaliar" quero dizer "forçar a forma normal da cabeça fraca". Além disso, ainda acho que sua explicação não está correta: você pode devolver o resultado, bse estiver . Eu acho que dizer que você está garantindo bque não será "avaliado" (ou analisado) em nenhum sentido é enganoso e até praticamente errado (e acho que é a diferença central com pseq). Eu acho que "forçar o resultado seq a bnecessariamente de forças ae seq a b = bquando a != ⊥" é mais preciso.
oisdk 25/01
@oisdk, mas "forçar" não é algo que Haskell conhece. - Sim, teoricamente você poderia "devolver o resultado de bse fosse " - isso seria algo que faz pelo menos sentido dizer, em Haskell, sem se referir a nenhuma implementação. Apenas, você não poderia realmente fazer isso, em geral - porque exigiria primeira prova que bé , e para isso você precisa resolver tha problema da parada.
leftaroundabout
1
Claro, "forçar" não é um termo que você pode usar para descrever a semântica, mas também não é "avaliar", e estou tentando apresentar uma alternativa às duas explicações que você deu: "a coisa à esquerda é avaliada como forma normal da cabeça fraca antes que o resultado à direita seja avaliado "," se a expressão à esquerda for ⊥, a da direita não deve ser avaliada ", ambas as quais acho erradas. Para uma explicação precisa, eu diria " seq a b = bquando a != ⊥" e, em seguida, para descrever como ele realmente funciona no GHC, eu diria "forçando o resultado de seq a bnecessariamente forças a".
oisdk 25/01