[Haskell-beginners] cps in yaht

Deng Wu wudeng256 at gmail.com
Sat Jul 13 11:47:45 CEST 2013


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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20130713/e033fbdd/attachment-0001.htm>


More information about the Beginners mailing list