
On Wed, Aug 20, 2014 at 02:19:16AM -0600, Dimitri DeFigueiredo wrote:
doTwice :: (a -> a) -> a -> a doTwice f x = f (f x)
what does this do?
ex1 :: (a -> a) -> a -> a ex1 = doTwice doTwice
At least, it is clear that there is a parameter to doTwice missing. So, I wanted to do:
ex1 y = (doTwice doTwice) y
but this gets me nowhere as I don't know how to apply the definition of doTwice inside the parenthesis without naming the arguments.
Note that function application associates to the left, so (doTwice doTwice) y = doTwice doTwice y So, we have ex1 y = doTwice doTwice y = doTwice (doTwice y) -- definition of doTwice Now we are stuck again; we can add another arbitrary parameter. ex1 y z = doTwice (doTwice y) z = (doTwice y) ((doTwice y) z) = doTwice y (doTwice y z) -- remove unnecessary parentheses = y (y (doTwice y z)) = y (y (y (y z))) Does that help?
What is the systematic way to evaluate these expressions? I actually got really stumped when I considered.
ex2 :: (a -> a) -> a -> a ex2 = doTwice doTwice doTwice doTwice
I assume this is not the same as
ex2 = (doTwice doTwice doTwice) doTwice
These ARE exactly the same. It's always the case that f w x y z ... = (((f w) x) y) z ... -Brent