Take a look here <http://bm380.user.srcf.net/cgi-bin/stepeval.cgi?expr=let+fix+f+%3D+f+%28fix+f%29%0D%0A++++fact+%3D+fix+%24+%5Cf+n+-%3E+if+n+%3D%3D+0+then+1+else+n+*+f+%28n+-+1%29%0D%0Ain+fact+4> . The above webpage uses stepval <https://github.com/bmillwood/stepeval>, it can evaluate any expression step by step using equational reasoning. On 27 January 2015 at 11:54, Karl Voelker <karl@karlv.net> wrote:
On Mon, Jan 26, 2015, at 08:43 PM, Animesh Saxena wrote:
I stumbled across this example as a shiny way of explaining why Lazy eval matters....
fact = fix $ \f n -> if n == 0 then 1 else n * f (n-1) fix f = f (fix f)
With lazy eval, I get
fact 4 = fix $ \f 4 (......)
Not quite. Let's go one step at a time:
fact 4 = (fix $ \f n -> if n == 0 then 1 else n * f (n - 1)) 4
Now we can bring in the definition of fix, substituting the argument to fix for all of the occurrences of f in the definition of fix. Notice that we can't substitute the 4 for n yet.
fact 4 = ((\f n -> if n == 0 then 1 else n * f (n - 1)) (fix $ \f n -> if n == 0 then 1 else n * f (n - 1))) 4
I think if you are very patient and methodical about performing the substitutions (and writing them out fully - no dot-dot-dot), then you'll figure out how it all works.
-Karl
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners
-- Regards Sumit Sahrawat