[英]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.