hi, everyone,

I'm learning haskell by reading the book <<Yet Another Haskell Tutorial>>, and I encounter a problem when comes to the contiuation passing style. The book gives a  cps fold like:

cfold’ f z [] = z
cfold’ f z (x:xs) = f x z (\y -> cfold’ f y xs)

and gives the test result:

CPS> cfold (+) 0 [1,2,3,4]
10
CPS> cfold (:) [] [1,2,3]
[1,2,3]

but, when I try to test this, I find there is a problem, the ghci gives:

-----------------------------------------------------------------------
*Main> cfold (+) 0 []

<interactive>:8:7:
    Occurs check: cannot construct the infinite type:
      t10 = (t10 -> t10) -> t10
    Expected type: t10 -> t10 -> (t10 -> t10) -> t10
      Actual type: t10 -> t10 -> t10
    In the first argument of `cfold', namely `(+)'
    In the expression: cfold (+) 0 []
    In an equation for `it': it = cfold (+) 0 []
------------------------------------------------------------------------

It makes sense to me, so I change the definition of cps to something like this:

cfold f z [] = z
cfold f z (x:xs) = (\y -> cfold f y xs) (f x z)

And it works fine:

*Main> cfold (+) 0 [1,2,3]
6

So my question comes, is it a bug in the book or something I miss here?



Regards!
-
wudeng