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?
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?
Respostas:
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.
afor ⊥, a `seq` bnão deve retornar o resultado de b.
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.
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.
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".
seq a bseria: "Avaliarb, em seguidaa, em seguida, retornarb".