理解Ramda.js

时间:2015-10-15 07:19:53

标签: javascript functional-programming ramda.js

问题1:

newlist = [s + x for x in mylist]

检查 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); } }; }; 的目的是什么?

问题2:

http://ramdajs.com/0.18.0/docs/#reduce

我如何阅读符号?

a['@@functional/placeholder'] === true

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

2 个答案:

答案 0 :(得分:2)

问题1:

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

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

因此@@functional/placeholder

中的foo没有区别
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)`
 ...

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

问题2:

符号在类型理论中是标准的,并由Haskell推广。 ab是任何类型。 (...)是一个类型元组,[a]是一个元素为a的列表。 a -> b是一个函数,它接受a类型的参数并返回类型为b的返回,并且是右关联的。有问题的例子是:

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

这读起来很容易混淆,但是一个未经描述的描述会更容易一些:它是一个带有三个参数的函数:第一个是函数(如上所述),第二个是值{{1} },第三个是a元素列表,返回值b

具体来说,a就是这样一个功能:在

R.reduce

R.reduce(add, 10, numbers); 是一个函数,它接受两个整数(adda相同,整数),并返回一个整数(b); (a, b) -> a的类型为整数(10); numbers是整数列表(a);返回值是一个整数([b])。

请注意,它混合了curried和uncurried语法;如果它是完全curry,a将是add,而不是a -> b -> a

答案 1 :(得分:1)

问题2:

这是Hindley-Milner型签名。对于给出的示例,'a'和'b'是任意类型和' - >'是一个功能。

所以让我们把它分解。

首先,我们采用类型'a'和函数'b - >一个“

(a,b - > a)

这会返回一个函数,它返回一个函数,...(因为你知道,currying)。关键是我们可以添加'()'以使其更具可读性。

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

所以如果你传递这个函数'a'和函数'a' - > 'b',你回来了

a - > ([b] - > a)

如果您传递此类型'a'

[b] - >一个

其中[b]是'b'类型的数组。传递这个功能[b]给你 a型

如果您想在JavaScript中阅读有关函数式编程的更多信息,我可以推荐The Mostly Adequate Guide