
On Wednesday 22 April 2009, Peter Verswyvelen wrote:
I'm having difficulty to understand the difference between WHNF and HNF.
Is this explanation<http://encyclopedia2.thefreedictionary.com/Weak+Head+Normal+For m> the correct one? Or is WHNF and HNF equivalent in Haskell land?
The GHC documentation of seq says: Evaluates its first argument to head normal form, and then returns its second argument as the result.
Let's try in GHCi
*Main> let f = trace "\\x" $ \x -> ((trace "\\y" $ \y -> trace "y" y + trace "x" x) $ trace "2" 2) *Main> f `seq` () \x () *Main>
That did not evaluate anything inside the body of the first lambda, so according to the article, seq reduces to weak head normal form, not hnf... Hi, Try:
Prelude Debug.Trace> (f 0) `seq` () \x \y y 2 x () -- Thanks! Marcin Kosiba