Understanding Ramda.js

Understanding Ramda.js

本文关键字:js Ramda Understanding      更新时间:2023-09-26

问题1:

   var _curry1 = function _curry1(fn) {
        return function f1(a) {
            if (arguments.length === 0) {
                return f1;
            } else if (a != null && a['@@functional/placeholder'] === true) {
                return f1;
            } else {
                return fn.apply(this, arguments);
            }
        };
    };

检查a['@@functional/placeholder'] === true的目的是什么?

问题2:

http://ramdajs.com/0.18.0/docs/减少

我怎么读符号?

(a,b -> a) -> a -> [b] -> a

这是我第一次看到这样的符号,它是从哪里来的?

问题1:

没有"符号"。__.js应该清除它:

module.exports = {'@@functional/placeholder': true};

所以@@functional/placeholderfoo

中没有区别
a = { foo: true }
a.foo
a["foo"]

(显然,你不能写a.@@functional/placeholder,因为那里有很多奇怪的符号。)

意图也可以在该文件中看到:

/**
 * A special placeholder value used to specify "gaps" within curried functions,
 * allowing partial application of any combination of arguments,
 * regardless of their positions.
 *
 * If `g` is a curried ternary function and `_` is `R.__`, the following are equivalent:
 *
 *   - `g(1, 2, 3)`
 *   - `g(_, 2, 3)(1)`
 *   - `g(_, _, 3)(1)(2)`
 *   - `g(_, _, 3)(1, 2)`
 *   - `g(_, 2, _)(1, 3)`
 *   - `g(_, 2)(1)(3)`
 *   - `g(_, 2)(1, 3)`
 *   - `g(_, 2)(_, 3)(1)`
 ...

因此,目的是能够在curry时"跳过"某些地方。该测试决定参数是真正的参数还是__.js占位符,并相应地进行操作。为什么是@@functional/placeholder -大概正是因为希望它太奇怪,从而不会与任何人的合法数据发生冲突。

问题2:

符号在类型理论中是标准的,并由Haskell推广。ab是任意类型。(...)是一个类型元组,[a]是一个元素为a的列表。a -> b是一个接受类型为a的参数并产生类型为b的返回值的函数,它是右结合函数。所讨论的示例如下:

是一个接受两个实参(分别为ab)并返回a类型值的函数;并产生一个接受a类型参数的函数,并返回一个接受b类型元素列表参数的函数,返回一个a类型的值。

这读起来非常令人困惑,但是一个未curry的描述会更容易一些:它是一个接受三个参数的函数:第一个是函数(如上所述),第二个是a的值,第三个是b元素的列表,并返回a的值。

具体来说,R.reduce是这样一个函数:在

R.reduce(add, 10, numbers);

add是一个函数,接受两个整数(ab都是整数),返回一个整数((a, b) -> a);10为整型(a);numbers是一个整数列表([b]);返回值为整数(a)。

注意它混合了柯里化和非柯里化的语法;如果完全curry, add将是a -> b -> a,而不是(a, b) -> a

问题2:

这是欣德利-米尔纳型签名。对于给出的例子,'a'和'b'是任意类型,'->'是一个函数。

让我们来分析一下。

首先,取类型'a'和函数'b -> a'

(a, b -> a)

返回一个函数,该函数返回一个函数,…(因为你知道,咖喱)。关键是我们可以添加'()'来让它更容易读。

(a, b -> a) -> (a -> ([b] -> a))

如果你传递这个函数a和一个函数a -> b,你会得到

a -> ([b] -> a)

如果你传递一个类型'a'

[b] -> a

其中[b]是类型为'b'的数组。传递这个函数[b]会得到A型A

如果你想阅读更多关于JavaScript函数式编程的内容,我可以推荐The most enough Guide