
Hi Shishir, Let's first consider a more straightforward version of the function. λ> let add_cps x y k = k (x+y) So add_cps is a function of x, y, and k, where k is a function that will be applied to x+y. Effectively it converts a function (k) of one argument into a function that takes two arguments. Let's examine the type signature. Now, k could be any function that takes one variable. Why don't we try "print"? In the next example, x=3, y=4, and k=print. What do we expect add_cps to do with those arguments? Well, it should apply the function k (which is "print") to the argument x+y. λ> add_cps 3 4 print 7 And that's what it does! Remember how partial application works? What would happen if we invoke add_cps, but leave out the final argument? The result is a function. That function has no name, and we can't print it, but we can look at its type signature. λ> :t add_cps 3 4 add_cps 3 4 ∷ Num a ⇒ (a → t) → t So this unnamed function takes another function of type a → t, and returns a function of type t. Effectively it converts a function of one argument into a function that takes two arguments. Let's try that with "print". λ> let f = add_cps 3 4 λ> f print 7 This leads us to an equivalent way to write add_cps: λ> let add_cps x y = \k -> k (x+y) This is identical to the first definition, even though it looks very different! Can you see why?