J'apprends le haskell en lisant le livre "Yet Another Haskell Tutorial", et je rencontre un problème quand vient le style passant de la contiuation. Le livre donne un cps se replient comme:cps dans "encore un autre haskell turorial"
cfold’ f z [] = z
cfold’ f z (x:xs) = f x z (\y -> cfold’ f y xs)
et donne le résultat du test:
CPS> cfold (+) 0 [1,2,3,4]
10
CPS> cfold (:) [] [1,2,3]
[1,2,3]
mais, lorsque je tente de le tester, je trouve qu'il ya un problème, le ghci donne:
*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 []
Il est logique pour moi, donc je changer la définition de cps à quelque chose comme ceci:
cfold f z [] = z
cfold f z (x:xs) = (\y -> cfold f y xs) (f x z)
Et cela fonctionne très bien:
*Main> cfold (+) 0 [1,2,3]
6
Ma question vient, est-il un bug dans le livre ou quelque chose qui me manque ici?