簡體   English   中英

無限重復值 Ramda

[英]Repeat value infinitely Ramda

對於壓縮,我怎樣才能 zip 一個重復單個值的列表?

期望:

R.zip([1, 2, 3])(R.repeat(2)); // [[1, 2], [2, 2], [3, 2]]

您可以使用R.ap作為R.zip function 和 function 的組合器,它采用長度,並重復和項目:

 const { ap, zip, pipe, length, repeat } = R const fn = item => ap( zip, pipe(length, repeat(item)) ) const result = fn(2)([1, 2, 3]) console.log(result)
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.min.js" integrity="sha512-t0vPcE8ynwIFovsylwUuLPIbdhDj6fav2prN9fEu/VYBupsmrmk9x43Hvnt+Mgn2h5YPSJOk7PMo9zIeGedD1A==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

這是一種矯枉過正,但只是為了完整性 - 您可以使用代理在 JS 中創建 Infinite lazy arrays。 創建一個帶有get陷阱的數組代理。 對於長度返回Infinity ,並調用 cb function 生成一個項目。 在這種情況下,我使用R.always為一個項目創建始終返回 2:

 const { zip, __, always } = R const getInfiniteArray = getItem => new Proxy([], { get(target, prop, receive) { return prop === 'length'? Infinity: getItem(target, prop, receive) } }) const fn = zip(__, getInfiniteArray(always(2))) const result = fn()([1, 2, 3]) console.log(result)
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.min.js" integrity="sha512-t0vPcE8ynwIFovsylwUuLPIbdhDj6fav2prN9fEu/VYBupsmrmk9x43Hvnt+Mgn2h5YPSJOk7PMo9zIeGedD1A==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

嘗試這個:

R.zip([1, 2, 3], R.repeat(2, 3));

正如有人指出的那樣,Ramda 不理解惰性列表,主要是因為 javascript 不提供對惰性求值的支持......

這可能是你能得到的最接近的,不過 ramda 在這里扮演的角色很小:

 function* infiniteZipWith(fn) { let number = 0; while (true) { yield [++number, fn()]; } }; const list = infiniteZipWith(R.always(2)); console.log(list.next().value); console.log(list.next().value); console.log(list.next().value);
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.min.js" integrity="sha512-t0vPcE8ynwIFovsylwUuLPIbdhDj6fav2prN9fEu/VYBupsmrmk9x43Hvnt+Mgn2h5YPSJOk7PMo9zIeGedD1A==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM