Todos nós sabemos (ou deveríamos saber) que Haskell é preguiçoso por padrão. Nada é avaliado até que deva ser avaliado. Então, quando algo deve ser avaliado? Existem pontos em que Haskell deve ser rigoroso. Eu chamo isso de "pontos de rigidez", embora esse termo em particular não seja tão difundido quanto eu pensava. De acordo comigo:
A redução (ou avaliação) em Haskell ocorre apenas em pontos de rigidez.
Portanto, a questão é: quais são, precisamente , os pontos de rigidez de Haskell? Minha intuição diz que main
, seq
padrões / bang, correspondência de padrões e qualquer IO
ação realizada por meio de main
são os pontos de rigidez primários, mas eu realmente não sei por que sei disso.
(Além disso, se não forem chamados de "pontos de rigidez", como são chamados?)
Imagino que uma boa resposta incluirá alguma discussão sobre WHNF e assim por diante. Eu também imagino que possa tocar no cálculo lambda.
Edit: pensamentos adicionais sobre esta questão.
Ao refletir sobre essa questão, acho que seria mais claro acrescentar algo à definição de um ponto de rigidez. Os pontos de rigidez podem ter contextos variados e profundidade (ou rigidez) variáveis . Retornando à minha definição de que "a redução em Haskell só ocorre em pontos de rigidez", vamos adicionar a essa definição esta cláusula: "um ponto de rigidez só é acionado quando seu contexto circundante é avaliado ou reduzido."
Então, deixe-me tentar fazer você começar com o tipo de resposta que desejo. main
é um ponto de rigidez. É especialmente designado como o principal ponto de rigidez de seu contexto: o programa. Quando o programa ( main
contexto de) é avaliado, o ponto de rigidez principal é ativado. A profundidade de Main é máxima: deve ser totalmente avaliada. Principal geralmente é composto de ações IO, que também são pontos de rigidez, cujo contexto é main
.
Agora você tenta: discutir seq
e combinar padrões nestes termos. Explique as nuances da aplicação da função: como é estrita? Como não é? Sobre o quê deepseq
? let
e case
declarações? unsafePerformIO
? Debug.Trace
? Definições de nível superior? Tipos de dados restritos? Padrões de estrondo? Etc. Quantos desses itens podem ser descritos em termos de apenas seq ou correspondência de padrões?
seq
casamento de padrões seja suficiente, com o resto definido em termos deles. Acho que a correspondência de padrões garante a rigidez da coluna vertebral dasIO
ações, por exemplo.