は、以下の再帰map
の関数である:明らかにcurried形式の再帰関数は末尾再帰型にできますか?考える
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)
は、再帰関数の最後のアクションではありません。しかし、スタックが巻き戻されたときに起こることは、完成したアキュムレータがそれ以上の変更や操作なしで返されることです。 map
は私の期待どおりに再帰的ですか?
を、私はこれが混乱 'map'の実装だと思います。一つの手続きで 'map'と' reduce'を組み合わせています。私は2つの別々の手順が 'map'の可読性を助けることを示すために[gist:u.js、y.js](https://gist.github.com/anonymous/6ccdd17b0b16f75bc38af2930ca6655f)を共有しています。私はまた、2つの実装がどのように比較されるかを示すために 'Y'を使って実装を行いました。あなたはおそらくこれを知っているでしょうが、 'Y'との唯一の違いは本当に' h(h) 'の代わりに' h'を適用することだけです。ああ、はい。さて、私たちは、テールコール除去を実装しているエンジンを待っています... – naomik
ありがとう@naomik、私はあなたに絶対に同意します。これは 'map'を' reduce'から導出せずにどのように実装できるかという挑戦に過ぎませんでした。私はこれを公表するつもりはなく、カイルしたテールポジションのアプリケーションが私を困惑させた。 – ftor
問題ありません**^_^** – naomik