Javascript 如何实施LoDash';s以功能JS的方式使用Ramda进行采样?

Javascript 如何实施LoDash';s以功能JS的方式使用Ramda进行采样?,javascript,functional-programming,ramda.js,Javascript,Functional Programming,Ramda.js,我试图以一种功能性的方式用Ramda实现LoDash的方法 有什么想法吗?除了从给定数组中获取randomIndex之外,我完全无法再进一步了。如何使用Ramda循环递归 因此,函数将如下所示: export const sampleSize = curry((size, list) => compose( // two paths of code // one to splice messages at the randomIndex // recursion with th

我试图以一种功能性的方式用Ramda实现LoDash的方法

有什么想法吗?除了从给定数组中获取
randomIndex
之外,我完全无法再进一步了。如何使用Ramda循环递归

因此,函数将如下所示:

export const sampleSize = curry((size, list) => compose(
  // two paths of code
  // one to splice messages at the randomIndex
  // recursion with the spliced array until length === size
  randomIndex
)(list))

首先,让我们定义一个函数,该函数将返回一个介于
min
(包含)和
max
(排除)之间的随机数。我们可以使用curry,因为
min
将始终设置为0, 而
max
将始终设置为新列表的长度-1

const random = curry((min, max) => Math.floor(Math.random() * (max - min) - min));
然后我们需要一个函数,它将获取一个列表并返回两个内容(在一个数组中):

  • 随机选取的元素
  • 没有该元素的新列表
  • 把所有东西放在一起:

    您可以看到,如果请求的样本大小大于实际列表大小,它将返回整个列表,但顺序是随机的

    const{curry,min,n,identity,converge,pair,flip,compose,length,remove,flatten}=R;
    const random=curry((最小,最大)=>Math.floor(Math.random()*(max-min)-min));
    const takeFromList=converge(converge(对,[n,翻转(移除)(1)]),[compose(随机(0),长度),identity]);
    const sampleSize=咖喱(大小,列表)=>{
    const[el,newList]=takeFromList(list);
    const len=min(大小、列表长度);
    返回len-1>0?展平([el,sampleSize(len-1,newList)]):[el];
    });
    log(抽样(2[1,2,3,4,5]);
    log(抽样(2[1,2,3,4,5]);
    log(抽样(2[1,2,3,4,5]);
    日志(抽样(20[1,2,3,4,5]);
    日志(抽样(20[1,2,3,4,5])
    
    首先,让我们定义一个函数,该函数将返回一个介于
    min
    (包含)和
    max
    (排除)之间的随机数。我们可以使用curry,因为
    min
    将始终设置为0, 而
    max
    将始终设置为新列表的长度-1

    const random = curry((min, max) => Math.floor(Math.random() * (max - min) - min));
    
    然后我们需要一个函数,它将获取一个列表并返回两个内容(在一个数组中):

  • 随机选取的元素
  • 没有该元素的新列表
  • 把所有东西放在一起:

    您可以看到,如果请求的样本大小大于实际列表大小,它将返回整个列表,但顺序是随机的

    const{curry,min,n,identity,converge,pair,flip,compose,length,remove,flatten}=R;
    const random=curry((最小,最大)=>Math.floor(Math.random()*(max-min)-min));
    const takeFromList=converge(converge(对,[n,翻转(移除)(1)]),[compose(随机(0),长度),identity]);
    const sampleSize=咖喱(大小,列表)=>{
    const[el,newList]=takeFromList(list);
    const len=min(大小、列表长度);
    返回len-1>0?展平([el,sampleSize(len-1,newList)]):[el];
    });
    log(抽样(2[1,2,3,4,5]);
    log(抽样(2[1,2,3,4,5]);
    log(抽样(2[1,2,3,4,5]);
    日志(抽样(20[1,2,3,4,5]);
    日志(抽样(20[1,2,3,4,5])
    
    我可能不会使用Ramda来做这件事。请注意,我是拉姆达的创始人之一,也是一个超级粉丝。但是Ramda是为函数式编程而设计的。函数式编程的主要原则之一是使用纯函数,这些函数在其参数之外不使用任何输入,除了返回值之外没有任何效果。对于相同的输入,它们应该始终返回相同的输出。当代码应该随机执行某些操作时,这将不起作用。1

    您可以使用lodash为此所做的代码、的早期返回版本,或者您可以使用类似的代码,它还可以按照原始数组中的顺序保留其结果:

    const sampleSize=(大小、列表、收集=[])=>size<1 | | list.length<1
    ? 收集
    :size>=list.length
    ? […已收集,…列表]//还是抛出错误?
    :Math.random()log(sampleSize(20、[1、2、3、4、5、6、7、8、9、10]))
    我可能不会使用Ramda来实现这一点。请注意,我是拉姆达的创始人之一,也是一个超级粉丝。但是Ramda是为函数式编程而设计的。函数式编程的主要原则之一是使用纯函数,这些函数在其参数之外不使用任何输入,除了返回值之外没有任何效果。对于相同的输入,它们应该始终返回相同的输出。当代码应该随机执行某些操作时,这将不起作用。1

    您可以使用lodash为此所做的代码、的早期返回版本,或者您可以使用类似的代码,它还可以按照原始数组中的顺序保留其结果:

    const sampleSize=(大小、列表、收集=[])=>size<1 | | list.length<1
    ? 收集
    :size>=list.length
    ? […已收集,…列表]//还是抛出错误?
    :Math.random()log(sampleSize(20、[1,2,3,4,5,6,7,8,9,10]))
    快速问题:在
    sampleSize
    函数中使用一些赋值运算符(这使它成为必需)和sti可以吗