Understanding Ramda.js
Understanding Ramda.js
问题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/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)`
...
因此,目的是能够在curry时"跳过"某些地方。该测试决定参数是真正的参数还是__.js
占位符,并相应地进行操作。为什么是@@functional/placeholder
-大概正是因为希望它太奇怪,从而不会与任何人的合法数据发生冲突。
问题2:
符号在类型理论中是标准的,并由Haskell推广。a
和b
是任意类型。(...)
是一个类型元组,[a]
是一个元素为a
的列表。a -> b
是一个接受类型为a
的参数并产生类型为b
的返回值的函数,它是右结合函数。所讨论的示例如下:
是一个接受两个实参(分别为a
和b
)并返回a
类型值的函数;并产生一个接受a
类型参数的函数,并返回一个接受b
类型元素列表参数的函数,返回一个a
类型的值。
这读起来非常令人困惑,但是一个未curry的描述会更容易一些:它是一个接受三个参数的函数:第一个是函数(如上所述),第二个是a
的值,第三个是b
元素的列表,并返回a
的值。
具体来说,R.reduce
是这样一个函数:在
R.reduce(add, 10, numbers);
add
是一个函数,接受两个整数(a
和b
都是整数),返回一个整数((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
- 可以't让我的if语句处理js中的html表单输入
- 使用agility.js进行页面布局和合成
- 使用递归、Ramda.js和无点样式重构字符串的getPermutations()
- ramda.js中的函数组合
- 为什么我的代码使用下划线.js但当我使用 Ramda.js 时却不行
- 我怎样才能用Ramda.js做得更好
- 在ramda.js中将两个属性合并在一起
- 使用ramda.js中的嵌套字段进行排序
- 如何查找数组中所有出现的元素的索引(Ramda.js方式)
- Ramda.js - 切片数组的内部值
- Ramda js:用于具有嵌套对象数组的深度嵌套对象的镜头
- Ramda Js:使用同一对象的值设置对象的属性
- 使用ramda.js获取嵌套对象数组中键的所有值
- 如何将两篇作文与Ramda.js合并
- Understanding Ramda.js
- Ramda.js refactoring
- 使用ramda.js过滤对象数组
- 使用Ramda.js的函数的无点版本
- Ramda.js通过对象值创建一个过滤器函数
- 我如何使用ramda.js重构这段代码?