问题 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 推广。 a 和 b 是任何类型。 (...) 是一个类型的元组,[a] 是一个列表,其元素是 a。 a -> b 是一个函数,它接受 a 类型的参数并产生 b 类型的返回,并且是右关联的。有问题的示例如下:
它是一个接受参数的函数,一个接受两个参数(分别为a 和b 类型)并返回a 类型值的函数;并生成一个函数,该函数接受a 类型的参数,并返回一个函数,该函数接受一个参数为b 类型的元素列表,返回一个a 类型的值。
这读起来很容易混淆,但不带柯里式的描述会更容易一些:它是一个接受三个参数的函数:第一个是函数(如上所述),第二个是 a 的值,第三个是b 元素的列表,返回值a。
具体来说R.reduce就是这样一个函数:在
R.reduce(add, 10, numbers);
add是一个函数,它接受两个整数(a和b都一样,整数),并返回一个整数((a, b) -> a); 10 是整数类型 (a); numbers 是整数列表 ([b]);并且返回值是一个整数(a)。
请注意,它混合了 curried 和 uncurried 语法;如果是完全咖喱,add 将是 a -> b -> a,而不是 (a, b) -> a。