问题一:
没有“符号”。__.js应该清除它:
module.exports = {'@@functional/placeholder': true};
所以与in@@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)`
...
所以目的是在currying时能够“跳过”一些地方。测试决定一个参数是真正的参数还是__.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
。