首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解Ramda.js

理解Ramda.js
EN

Stack Overflow用户
提问于 2015-10-15 07:19:53
回答 2查看 485关注 0票数 3

问题1:

代码语言:javascript
复制
   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/#reduce

我怎么读表示法?

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-15 07:33:13

问题1:

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

代码语言:javascript
复制
module.exports = {'@@functional/placeholder': true};

因此,@@functional/placeholderfoo

代码语言:javascript
复制
a = { foo: true }
a.foo
a["foo"]

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

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

代码语言:javascript
复制
/**
 * 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的值。

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

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

代码语言:javascript
复制
R.reduce(add, 10, numbers);

add是一个函数,它接受两个整数( ab都是相同的整数),并返回一个整数((a, b) -> a);10是整数(a)类型;数字是整数列表([b]);返回值是整数(a)。

注意,它混合了咖喱语法和非咖喱语法;如果它是完全咖喱的,那么add将是a -> b -> a,而不是(a, b) -> a

票数 2
EN

Stack Overflow用户

发布于 2015-10-15 07:33:00

问题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。

一个

如果您想阅读更多关于JavaScript函数式编程的内容,我可以推荐最充分的指南

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33142252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档