3

これは、CPS スタイルを使用してリスト内の要素を乗算する関数です。

mlist xx k = aux xx k
  where aux [] nk = nk 1
    aux (0:xs) nk = k 0
    aux (x:xs) nk = aux xs $ \v -> mul x v nk

aux (0:xs) nk = k 0で'k' を 'nk'に変更するとどうなりますか? 2 つの違いは何ですか?

4

2 に答える 2

4

kは常に渡される元の継続mlistですが、リスト[1、0]nkの場合、その場合は\v -> mul 1 v k(の3番目のケースからaux)になります。

mulがとして定義されていると仮定すると、常に0になるmul x y k = k $ x*yため、これは実際的な違いにはなりません。yただし、その結果に到達する実際の方法は異なります(コンパイラによる最適化の可能性を除く)。

于 2010-07-09T00:51:15.867 に答える
1

違いは、元の定義は末尾呼び出しアプリケーションによって渡された構築された乗算を「短絡」するのに対し、変更された式は値のテストのみを短絡し、継続関数の構築された「バージョン」を保持することです。

于 2010-07-09T07:34:16.963 に答える