Учитывая это рекуррентное map
функция:Может ли рекурсивная функция в карри форме быть хвостом рекурсивным?
const U = f => f(f);
const map = f => U(h => acc => ([head, ...tail]) => head === undefined
? acc
: h(h)([...acc, f(head)])(tail))([]);
const xs = [1,2,3,4,5];
console.log(map(x => x * x)([1,2,3,4,5]));
Очевидно, что рекурсивный вызов h(h)
не последнее действие рекурсивной функции. Но когда стек размотан, все, что происходит, - это то, что готовый аккумулятор возвращается без каких-либо дальнейших изменений или операций. Is map
против моих ожиданий хвост рекурсивный?
Я думаю, что это запутанная 'реализация map'. Он смешивает 'map' и' reduce' вместе в одной процедуре. Я делюсь [gist: u.js, y.js] (https://gist.github.com/anonymous/6ccdd17b0b16f75bc38af2930ca6655f), чтобы показать, что две отдельные процедуры помогают прочитать «карту». Я также выполнил реализацию с использованием 'Y', чтобы показать, как сравниваются две реализации. Вы, наверное, знаете это, но единственная разница с 'Y' заключается в том, что вы просто применяете' h' вместо 'h (h)'. О, да, хвост звонит повсюду. Теперь мы просто ждем на двигателе, который реализует устранение хвостового вызова ... – naomik
Спасибо @naomik, я абсолютно согласен с вами. Это была просто проблема, как «карта» может быть реализована без получения ее из «уменьшения». У меня не было намерения публиковать это, до тех пор, пока явное приложение в хвосте не сбило меня с толку. – ftor
Нет проблем **^_^** – naomik