
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