これは、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 つの違いは何ですか?
これは、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 つの違いは何ですか?
k
は常に渡される元の継続mlist
ですが、リスト[1、0]nk
の場合、その場合は\v -> mul 1 v k
(の3番目のケースからaux
)になります。
mul
がとして定義されていると仮定すると、常に0になるmul x y k = k $ x*y
ため、これは実際的な違いにはなりません。y
ただし、その結果に到達する実際の方法は異なります(コンパイラによる最適化の可能性を除く)。
違いは、元の定義は末尾呼び出しアプリケーションによって渡された構築された乗算を「短絡」するのに対し、変更された式は値のテストのみを短絡し、継続関数の構築された「バージョン」を保持することです。