Qu'est-ce que la Faiblesse de la Tête Forme Normale?

Ce n' la Faiblesse de la Tête à la Forme Normale de (WHNF) signifie? Ce n' Tête à la forme Normale de (HNF) et Forme Normale (NF) signifie?

Real World Haskell états:

Le familier seq fonction évalue une expression de ce que nous appelons la tête
forme normale (en abrégé HNF). Il s'arrête une fois qu'il atteint la limite extérieure de
constructeur (la “tête”). Elle est distincte de la forme normale (NF), dans
dont une expression est complètement évaluées.

Vous entendrez aussi Haskell programmeurs reportez-vous à la faiblesse de la forme normale de tête
(WHNF). Pour les données normales, la faiblesse de la tête à la forme normale est la même que la tête
forme normale. La différence se pose uniquement pour les fonctions, et il est trop
abscons pour qui nous intéresse ici.

J'ai lu un peu de ressources et définitions (Haskell Wiki et Haskell Liste De Courrier et Gratuit Dictionnaire) mais je ne l'obtenez pas. Quelqu'un peut peut-être donner un exemple ou fournir un profane définition?

Je suis deviner qu'il serait semblable à:

WHNF = thunk : thunk

HNF = 0 : thunk 

NF = 0 : 1 : 2 : 3 : []

Comment seq et ($!) se rapportent à WHNF et HNF?

Mise à jour

Je suis encore confus. Je sais que certaines des réponses que dire de l'ignorer HNF. À partir de la lecture des différentes définitions, il semble qu'il n'y a pas de différence entre les données dans WHNF et HNF. Cependant, il semble comme il y a une différence quand il s'agit d'une fonction. Si il n'y a pas de différence, pourquoi est - seq nécessaire pour foldl'?

Un autre point de confusion est à partir de la Haskell Wiki, qui stipule que seq réduit à WHNF, et ne rien faire pour l'exemple suivant. Alors ils disent qu'ils ont à utiliser seq forcer l'évaluation. N'est-ce pas la forcer à HNF?

Commune newbie de la pile déborde code:

myAverage = uncurry (/) . foldl' (\(acc, len) x -> (acc+x, len+1)) (0,0)

Des gens qui comprennent seq et la faiblesse de la tête forme normale (whnf) peut
de comprendre immédiatement ce qui ne va pas ici. (acc+x, len+1) est déjà
dans whnf, donc seq, ce qui réduit d'une valeur de whnf, ne fait rien pour cela.
Ce code va créer des thunks tout comme l'original foldl exemple,
il va juste être à l'intérieur d'un tuple. La solution est simplement de la force de la
les composants de la n-uplet, par exemple

myAverage = uncurry (/) . foldl' 
          (\(acc, len) x -> acc `seq` len `seq` (acc+x, len+1)) (0,0)

-Haskell Wiki sur Stackoverflow

  • Généralement on parle de WHNF et FRR. (FRR être ce que vous appelez NF)
  • Quel est le R dans FRR stand for?
  • Réduit
InformationsquelleAutor | 2011-07-29