Проблема стиля программирования на Haskell CPS - PullRequest
3 голосов
/ 09 июля 2010

здесь функция умножает элементы в списке, используя стиль 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

что если я заменим 'k' на 'nk' в выражении aux (0: xs) nk = k 0 , в чем разница между этими двумя?

Ответы [ 2 ]

4 голосов
/ 09 июля 2010

k всегда является исходным продолжением, переданным mlist, тогда как для списка [1, 0] nk в этом случае будет \v -> mul 1 v k (из третьего случая aux).

Если мы предположим, что mul определено как mul x y k = k $ x*y, это не имеет практического значения, поскольку y всегда будет 0. Но фактический метод достижения этого результата отличается (за исключением возможных оптимизаций компилятором).

1 голос
/ 09 июля 2010

Разница в том, что первоначальное определение «коротких замыканий» любых встроенных умножений, передаваемых приложениями хвостового вызова, в то время как измененное выражение только замыкает короткие замыкания, проверяющие значения - оно сохраняет встроенную «версию» функции продолжения. .

...