Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种方法可以在不列出参数的情况下编写此Javascript函数?_Javascript_Functional Programming_Function Composition_Pointfree - Fatal编程技术网

有没有一种方法可以在不列出参数的情况下编写此Javascript函数?

有没有一种方法可以在不列出参数的情况下编写此Javascript函数?,javascript,functional-programming,function-composition,pointfree,Javascript,Functional Programming,Function Composition,Pointfree,我试图编写一个函数,使用另一个函数比较两个项目,然后检查结果是否大于也提供给该函数的其他值。我可以这样写: const compareDifference = function(t1, t2, threshold) { return getDifference(t1, t2) > threshold; }; 。。。但这似乎不是很实用。我发现的每一个经典组合示例都假设在调用函数之前我知道要比较的值,在这种情况下,我可以这样编写函数: const greaterThan = (x,

我试图编写一个函数,使用另一个函数比较两个项目,然后检查结果是否大于也提供给该函数的其他值。我可以这样写:

const compareDifference = function(t1, t2, threshold) {
    return getDifference(t1, t2) > threshold;
};
。。。但这似乎不是很实用。我发现的每一个经典组合示例都假设在调用函数之前我知道要比较的值,在这种情况下,我可以这样编写函数:

const greaterThan = (x, y) => x > y;
const greaterThan10 = _.partial(greaterThan, _, 10);
const compareDifference = _.compose(greaterThan10, getDifference);
因为我对函数式编程比较陌生,所以我觉得这里缺少了一些简单或基本的东西。有没有一种方法可以编写函数,这样它就合并了要传递给greaterThan的参数,而无需我明确地提及它?理想的情况是:

const compareDifference = _.compose(_.partial(greaterThan, _), getDifference);

如果我用这个错误的树,那么告诉我,我会编辑,但是如果我想做这样的“更实用”的事情,我会做以下事情:

let greaterThan = _.curry((x, y) => y > x); // notice the args are flipped
let difference = _.curry((x, y) => Math.abs(x - y));
let greaterThan5 = greaterThan(5); // this naming is why we ordered the args backwards
let differenceBetweenGreaterThan5 = _.compose(greaterThan5, difference);
differenceBetweenGreaterThan5(10, 34); // true
differenceBetweenGreaterThan5(10, 6); // false
然后我们可以像这样重写您的原始函数:

let compareDiff = (threshold, x, y) => {
  return _.compose(greaterThan(threshold), difference)(x)(y);
};
虽然我可能只会使用类似于
的differencebetween-reaterhan5

我也为那些滑稽的长变量名道歉,但我想让它清楚地知道我在命名什么。还有一些事情需要注意:我将参数重新排序为
大于
,以使部分应用程序的命名更加合理,并避免使用
\uucode>占位符。虽然我引用了<代码>差异< /代码>,但它认为它对一般性的东西有好处,但对于这个例子来说,它不是严格必要的。

至于我认为你们遗漏了什么,这个例子中的函数方法(根据我对“函数方法”含义的理解)是,我们打破了一个复杂的情况,即获取两个数字之间的差值,看看第三个数字是否在这个范围内,将其分解为原子成分,并将其构造为原子元素的组合,如
大于
差异


这是一个困难的突破和重建:要做到这一点,需要对论点进行重新排序,以获得灵活性、便利性和清晰性(甚至是相对于我在上面一段中首先给出“第三个”数字的英文版本)。在我看来,参数和工件重新排序部分似乎是您所缺少的部分。

如果我用这一点选错了树,那么告诉我,我会编辑,但如果我想做这样“更实用”的事情,我会做以下操作:

let greaterThan = _.curry((x, y) => y > x); // notice the args are flipped
let difference = _.curry((x, y) => Math.abs(x - y));
let greaterThan5 = greaterThan(5); // this naming is why we ordered the args backwards
let differenceBetweenGreaterThan5 = _.compose(greaterThan5, difference);
differenceBetweenGreaterThan5(10, 34); // true
differenceBetweenGreaterThan5(10, 6); // false
然后我们可以像这样重写您的原始函数:

let compareDiff = (threshold, x, y) => {
  return _.compose(greaterThan(threshold), difference)(x)(y);
};
虽然我可能只会使用类似于
的differencebetween-reaterhan5

我也为那些滑稽的长变量名道歉,但我想让它清楚地知道我在命名什么。还有一些事情需要注意:我将参数重新排序为
大于
,以使部分应用程序的命名更加合理,并避免使用
\uucode>占位符。虽然我引用了<代码>差异< /代码>,但它认为它对一般性的东西有好处,但对于这个例子来说,它不是严格必要的。

至于我认为你们遗漏了什么,这个例子中的函数方法(根据我对“函数方法”含义的理解)是,我们打破了一个复杂的情况,即获取两个数字之间的差值,看看第三个数字是否在这个范围内,将其分解为原子成分,并将其构造为原子元素的组合,如
大于
差异


这是一个困难的突破和重建:要做到这一点,需要对论点进行重新排序,以获得灵活性、便利性和清晰性(甚至是相对于我在上面一段中首先给出“第三个”数字的英文版本)。在我看来,论据和重新排序部分似乎是您所缺少的。

我认为LUH3417的答案对于初学者来说非常好。它涉及到一些基本知识,但我认为还有一些其他信息的空间

首先,如果您希望在原始问题中使用完全相同的API,您可以将其分解为如下部分

const comp=f=>g=>x=>f(g(x))
常数comp2=comp(comp)(comp)
常数翻转=f=>x=>y=>f(y)(x)
常数sub=x=>y=>y-x
常数abs=x=>Math.abs
常数差=组件2(数学abs)(子)
常数gt=x=>y=>y>x
//你的功能。。。
//写得比差得多
//比较差异::数字->数字->数字->布尔
常量比较差异=comp2(翻转(gt))(差异)
控制台日志(比较差异(3)(1)(10))
//=燃气轮机(10)(abs(第(1)(3)款)
//=数学绝对值(1-3)>10
//=>错误
控制台日志(比较差异(5)(17)(10))
//=燃气轮机(10)(abs(第(5)(17)款)
//=数学绝对值(17-5)>10

//=>正确
我认为LUH3417的答案对初学者来说非常好。它涉及到一些基本知识,但我认为还有一些其他信息的空间

首先,如果您希望在原始问题中使用完全相同的API,您可以将其分解为如下部分

const comp=f=>g=>x=>f(g(x))
常数comp2=comp(comp)(comp)
常数翻转=f=>x=>y=>f(y)(x)
常数sub=x=>y=>y-x
常数abs=x=>Math.abs
常数差=组件2(数学abs)(子)
常数gt=x=>y=>y>x
//你的功能。。。
//写得比差得多
//比较差异::数字->数字->数字->布尔
常量比较差异=comp2(翻转(gt))(差异)
控制台日志(比较差异(3)(1)(10))
//=燃气轮机(10)(abs(第(1)(3)款)
//=数学绝对值(1-3)>10
//=>错误
控制台日志(比较差异(5)(17)(10))
//=燃气轮机(10)(abs(第(5)(17)款)
//=数学绝对值(17-5)>10

//=>真的
你能准确地解释一下你想如何使用你的函数吗?我想用这三个参数同时调用它,就像我可以用顶部的原始版本一样。So:比较差异(第1项、第2项、第10项);“这似乎不太实用”-绝对没有什么问题。你能解释一下exac吗