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?
Vem do ponto de sequência . Esse é um conceito bem conhecido em C e, de fato, bastante semelhante ao seq
operador 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 pseq
ou deepseq
alternativas 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á seq
fora se souber que as expressões não divergem.
seq a b
seria: "Avaliarb
, em seguidaa
, em seguida, retornarb
".a
for ⊥,a `seq` b
não deve retornar o resultado deb
.b
se estiver⊥
. Eu acho que dizer que você está garantindob
que não será "avaliado" (ou analisado) em nenhum sentido é enganoso e até praticamente errado (e acho que é a diferença central compseq
). Eu acho que "forçar o resultadoseq a b
necessariamente de forçasa
eseq a b = b
quandoa != ⊥
" é mais preciso.b
se 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 queb
é⊥
, e para isso você precisa resolver tha problema da parada.seq a b = b
quandoa != ⊥
" e, em seguida, para descrever como ele realmente funciona no GHC, eu diria "forçando o resultado deseq a b
necessariamente forçasa
".