我需要一个函数,它接受任意数量的参数(所有相同的类型),对它们做一些事情然后给出一个结果.在我的具体情况下,参数列表是不切实际的.
当我查看haskell库时,我看到函数printf(来自模块Text.Printf)使用了类似的技巧.不幸的是,通过查看来源我无法理解这种魔力.
有人可以解释如何实现这一点,或至少一些网页/纸/任何我可以找到一个良好的描述吗?
动机:
我需要它的原因非常简单.对于学校(计算机科学课),我们需要编写一个能够"记录"数学表达式,将其表示为字符串的模块(通过为自己的数据类型编写Num/Real/etc的实例),并执行对它的各种操作.
此数据类型包含变量的特殊构造函数,可以由值或指定函数的任何值替换.其中一个目标是编写一个函数,它使用一些变量(类型对(Char,Rational))来表达这种表达式并计算表达式的结果.我们应该看看如何最好地表达函数的目标.(我的想法:该函数返回另一个函数,它接受与函数中定义的变量一样多的参数 - 似乎是不可能的).
我已经看到很多函数是根据模式定义的(f .) . g.例如:
countWhere = (length .) . filter
duplicate = (concat .) . replicate
concatMap = (concat .) . map
Run Code Online (Sandbox Code Playgroud)
这是什么意思?
haskell functional-programming pointfree function-composition tacit-programming
我正在学习JavaScript - 真正学习JavaScript.我来自PHP背景,所以一些JavaScript概念对我来说仍然是新的,尤其是异步编程.这个问题可能已经多次回答,但我找不到答案.这可能是因为我甚至不知道如何通过展示一个例子来提出问题.所以这里是:
从npm 使用deferred包时,我看到以下示例:
delayedAdd(2, 3)(function (result) {
return result * result
})(function (result) {
console.log(result); // 25
});
Run Code Online (Sandbox Code Playgroud)
他们将此称为链接,它实际上是有效的,因为我目前正在使用此代码来检查承诺何时解决或被拒绝.即使他们称之为链接,它也会让我想起像Swift那样的尾随闭包.
我真的不明白这是什么类型的链接,因为我们有一个函数调用,然后紧接着,括在括号中的匿名函数.
所以我想我有两个问题.
这是delayedAdd函数:
var delayedAdd = delay(function (a, b) {
return a + b;
}, 100);
Run Code Online (Sandbox Code Playgroud)
它使用以下功能:
var delay = function (fn, timeout) {
return function () {
var def = deferred(), self = this, args = arguments;
setTimeout(function () {
var value;
try {
value = fn.apply(self, args));
} catch (e) {
def.reject(e);
return; …Run Code Online (Sandbox Code Playgroud) 我已经在一个名为Ramda的Javascript FP库上工作了一段时间,我在命名方面遇到了一些问题.(你听说过这条旧线,对吗?"计算机科学只有两个难题:缓存失效,命名事物和一个一个错误.")
在这个库中,(几乎)多个参数的每个函数都会自动计算.这适用于大多数用例.但是有一些问题是一些函数是非交换二元运算符.问题在于,英语名称往往意味着与应用currying时所发生的不同.例如,
var div10 = divide(10);
Run Code Online (Sandbox Code Playgroud)
听起来它应该是一个将其参数除以10的函数.但实际上它将其参数分为 10,如果你看一下这个定义就很清楚了:
var divide = curry(function(a, b) {
return a / b;
});
Run Code Online (Sandbox Code Playgroud)
所以相反的预期:
div10(50); //=> 5 // NO!!
Run Code Online (Sandbox Code Playgroud)
事实上,你得到了
div10(50); //=> 0.2 // Correct, but surprising!
Run Code Online (Sandbox Code Playgroud)
我们通过记录从人们的预期可能的差别,并创建处理这个问题divideBy,这只是flip(divide)和subtractN,这是flip(subtract).但是我们还没有找到一个很好的等价函数,例如lt:
R.lt = curry(function(a, b) {
return a < b;
});
Run Code Online (Sandbox Code Playgroud)
或它的表兄弟lte,gt和gte.
我自己的直觉就是这样
map(lt(5), [8, 6, 7, 5, 3, 0, 9]);
//=> [false, false, false, false, …Run Code Online (Sandbox Code Playgroud) lodash的新手,并尝试使用它来获得更多的了解。我不了解以下代码的行为。
在了解到的arity参数之后_.curry,我得到了一个代码片段,该片段产生的结果对我来说似乎很奇怪。
const words = ['jim', 'john'];
const pad10 = words =>
_.map(words, word => _.pad(word, 10));
console.log(pad10(words)); // [ ' jim ', ' john ' ]
const flipMap = _.flip(_.map);
const flipPad = _.flip(_.pad);
const curriedFlipMap = _.curry(flipMap, 2);
const pad10v2 = curriedFlipMap(word => flipPad(' ', 10, word));
console.log(pad10v2(words)); // [ ' jim ', ' john ' ]
const curriedFlipPad = _.curry(flipPad, 3);
const padWord10 = curriedFlipPad(' ', 10);
const pad10v3 = curriedFlipMap(word => padWord10(word));
console.log(pad10v3(words)); // …Run Code Online (Sandbox Code Playgroud)我有一个寻找名字的功能.
我一直在用Javascript 构建一个新的函数式编程库,最近我添加了一个对我有用的新函数.我命名了它,useWith但我想知道它是否是功能程序员以不同名称已知的功能.
该函数与之相关compose,因为它返回一个新函数,它结合了几个现有函数,但方式略有不同compose.它接收的第一个参数被挑选出来; 其余部分均匀处理.当调用返回的函数时,参数将分别传递给其余每个函数,结果以及任何未配对的参数将被发送到第一个函数,然后返回其结果.因此,如果只使用两个函数调用它,并且如果结果函数传递一个参数,则这与compose完全等效.但它有多个参数的附加功能.
我想要这个函数的原因是我实现了类似projectMichal Fogus在Functional Javascript中提供的函数,project类似于Codd的类似Javascript对象的数组,类似于SQL的select动词.写这样很容易:
var project = curry(function(keys, table) {
return map(pick(keys), table);
});
// Used like this:
var kids = [{name: 'Bob', age: 3, eyes: 'blue', hair: 'brown'},
{name: 'Sue', age: 5, eyes: 'hazel', hair: 'blonde'}];
project(['name', 'eyes'], kids);
//=> [{name: 'Bob', eyes: 'blue'}, {name: 'Sue', eyes: 'hazel'}]
Run Code Online (Sandbox Code Playgroud)
但我真的想以无点的方式实现它.但当然这不起作用:
var project = compose(map, pick); // NO!
Run Code Online (Sandbox Code Playgroud)
...因为没有设施通过第二个参数, …
我目前正在处理个人时间的编程问题,要求我创建一个可以这种方式调用的javascript函数.
add(1) // 1
add(1)(2) // 3
add(1)(2)(3); // 6
add(1)(2)(3)(4); // 10
add(1)(2)(3)(4)(5); // 15
Run Code Online (Sandbox Code Playgroud)
我弄清楚的是如何使它在最后一次调用时返回一个值.
例如,为了add(1)(2)工作,那么add(1)必须返回一个函数,但是根据指令add(1)自己调用时会返回1.
我假设你能克服这个问题的一种方法是弄清楚add函数被连续多少次被调用,但我想不出有办法实现这一点.有没有人有任何可以指出我正确方向的提示?
我喜欢柯里化,但有几个 Javascript 开发人员拒绝这种技术的原因有几个:
f(x) (y) (z)有没有一种方法可以减轻这些担忧,这样我的同事就不会讨厌我?
javascript functional-programming currying function-composition higher-order-functions
我正在学习函数式编程,我想知道是否有办法"组合"这样的函数:
function triple(x) {
return x * 3;
}
function plusOne(x) {
return x + 1;
}
function isZero(x) {
return x === 0;
}
combine(1); //1
combine(triple)(triple)(plusOne)(1); // 10
combine(plusOne)(triple)(isZero)(-1); // true
Run Code Online (Sandbox Code Playgroud)
如果para是一个函数,它将函数"组合"到自身中,如果不是,它将返回最终结果.谢谢!
我喜欢ECMAScript 6允许您编写如下的咖喱函数:
var add = x => y => z => x + y + z;
Run Code Online (Sandbox Code Playgroud)
但是,我讨厌我们需要在咖喱函数的每个参数中加上括号:
add(2)(3)(5);
Run Code Online (Sandbox Code Playgroud)
我希望能够一次将咖喱函数应用于多个参数:
add(2, 3, 5);
Run Code Online (Sandbox Code Playgroud)
我该怎么办?我不在乎性能。
javascript functional-programming currying apply ecmascript-6
javascript ×8
currying ×3
haskell ×2
apply ×1
curry ×1
deferred ×1
ecmascript-6 ×1
lodash ×1
node.js ×1
pointfree ×1
polyvariadic ×1
ramda.js ×1