「Yet Another Haskell Tutorial」という本を読んで Haskell を学んでいるのですが、継続渡しスタイルになると問題が発生します。この本は、次のような cps フォールドを提供します。
cfold’ f z [] = z
cfold’ f z (x:xs) = f x z (\y -> cfold’ f y xs)
テスト結果は次のとおりです。
CPS> cfold (+) 0 [1,2,3,4]
10
CPS> cfold (:) [] [1,2,3]
[1,2,3]
しかし、これをテストしようとすると、問題があることがわかりました.ghciは次のように与えます:
*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 []
私には理にかなっているので、cps の定義を次のように変更します。
cfold f z [] = z
cfold f z (x:xs) = (\y -> cfold f y xs) (f x z)
そしてそれはうまくいきます:
*Main> cfold (+) 0 [1,2,3]
6
それで私の質問が来ます、それは本のバグですか、それとも私がここで見逃しているものですか?