相关疑难解决方法(0)

如何创建polyvariadic haskell函数?

我需要一个函数,它接受任意数量的参数(所有相同的类型),对它们做一些事情然后给出一个结果.在我的具体情况下,参数列表是不切实际的.

当我查看haskell库时,我看到函数printf(来自模块Text.Printf)使用了类似的技巧.不幸的是,通过查看来源我无法理解这种魔力.

有人可以解释如何实现这一点,或至少一些网页/纸/任何我可以找到一个良好的描述吗?

动机:

我需要它的原因非常简单.对于学校(计算机科学课),我们需要编写一个能够"记录"数学表达式,将其表示为字符串的模块(通过为自己的数据类型编写Num/Real/etc的实例),并执行对它的各种操作.

此数据类型包含变量的特殊构造函数,可以由值或指定函数的任何值替换.其中一个目标是编写一个函数,它使用一些变量(类型对(Char,Rational))来表达这种表达式并计算表达式的结果.我们应该看看如何最好地表达函数的目标.(我的想法:该函数返回另一个函数,它接受与函数中定义的变量一样多的参数 - 似乎是不可能的).

haskell variadic-functions function-parameter polyvariadic

69
推荐指数
5
解决办法
1万
查看次数

什么(f.).在Haskell中意味着什么?

我已经看到很多函数是根据模式定义的(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

49
推荐指数
2
解决办法
3709
查看次数

理解延迟执行链的语法

我正在学习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那样的尾随闭包.

我真的不明白这是什么类型的链接,因为我们有一个函数调用,然后紧接着,括在括号中的匿名函数.

所以我想我有两个问题.

  1. 这是什么模式?
  2. 它是如何工作的?这可能是一个很复杂的问题,但我想知道某些事情是如何运作的,所以当有人问我这件事时我可以给他们一个详细的解释.

这是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)

javascript node.js deferred

28
推荐指数
5
解决办法
2380
查看次数

翻译版本的`lt`,`lte`,`gt`和`gte`的好名字?

我已经在一个名为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,gtgte.

我自己的直觉就是这样

map(lt(5), [8, 6, 7, 5, 3, 0, 9]); 
//=> [false, false, false, false, …
Run Code Online (Sandbox Code Playgroud)

javascript functional-programming ramda.js

13
推荐指数
1
解决办法
2660
查看次数

什么时候a =&gt; f(a)不等于f?

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 functional-programming curry lodash

6
推荐指数
1
解决办法
210
查看次数

这个扩展的'compose`函数有什么好名字?

我有一个寻找名字的功能.

我一直在用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 functional-programming

5
推荐指数
1
解决办法
539
查看次数

编写一个curried javascript函数,可以调用任意次数,在最后一次函数调用中返回一个值

我目前正在处理个人时间的编程问题,要求我创建一个可以这种方式调用的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函数被连续多少次被调用,但我想不出有办法实现这一点.有没有人有任何可以指出我正确方向的提示?

我读过这两篇文章(1,2上的功能柯里),我理解他们,但我不知道怎么做的参数个数可变打交道时钻营.

javascript functional-programming currying

5
推荐指数
1
解决办法
191
查看次数

如何协调 Javascript 与柯里化和函数组合

我喜欢柯里化,但有几个 Javascript 开发人员拒绝这种技术的原因有几个:

  1. 关于典型咖喱图案的美学问题: f(x) (y) (z)
  2. 担心由于函数调用次数增加而导致的性能损失
  3. 由于许多嵌套的匿名函数而担心调试问题
  4. 关注无点样式的可读性(与组合有关的柯里化)

有没有一种方法可以减轻这些担忧,这样我的同事就不会讨厌我?

javascript functional-programming currying function-composition higher-order-functions

5
推荐指数
0
解决办法
349
查看次数

以功能的方式在javascript中"组合"功能?

我正在学习函数式编程,我想知道是否有办法"组合"这样的函数:

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是一个函数,它将函数"组合"到自身中,如果不是,它将返回最终结果.谢谢!

javascript functional-programming

3
推荐指数
1
解决办法
4765
查看次数

JavaScript和ES6中用于咖喱函数的函数应用程序

我喜欢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

1
推荐指数
1
解决办法
901
查看次数