1

「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

それで私の質問が来ます、それは本のバグですか、それとも私がここで見逃しているものですか?

4

2 に答える 2

2

Yet Another Haskell Tutorialにもcfoldの定義があります

cfold f z l = cfold' (\x t g -> f x (g t)) z l

この関数cfoldcfold'を使用しています

WinHugs 環境では正常に動作しています。

于 2013-07-13T11:24:33.097 に答える