Javascript 如何实施LoDash';s以功能JS的方式使用Ramda进行采样?
我试图以一种功能性的方式用Ramda实现LoDash的方法 有什么想法吗?除了从给定数组中获取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
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可以吗