有没有人为javascript提出了一个Pipe运算符?

时间:2015-11-05 16:54:21

标签: javascript functional-programming

许多语言都有一个运算符,允许您将一个操作的结果传递给另一个操作的调用(例如bash中的|运算符,F#中的|>运算符。)

我认为javascript中方法链接的常用习惯的一大优点是它从上到下,从左到右读取:

var fooOddSquares = [1, 2, 3, 4, 5]
    .filter(x => x % 2)
    .map(x => "foo" + x * x)
    .reduce(((acc, str, i) => acc[i + 1] = str; return acc), {});

// => {1: "foo1", 2: "foo9", 3: "foo25"}

与成分代码比较:

var something = func5(
    func4(
        func3(
            func2(
                func1(
                    somedata
                )
            )
        )
    )
);

从右到左,从下到上阅读。我意识到这可以通过功能组合来清理,但这不一定是重点。只是为了清楚地了解我正在寻找的东西:

var something = func1(somedata)
    |> func2
    |> func3
    |> func4
    //etc...

在javascript中对管道运算符进行谷歌搜索主要会显示有关按位OR运算的信息。然而,通过一些挖掘,我能够挖掘出this文章,描述了操作符重载的脏兮兮的版本,它可以实现我正在谈论的内容。我还发掘了this用于描述所述运算符的要点,并说“它已被提议用于javascript”。

看看ES 2016,我看到了一个求幂运算符和绑定运算符的提议。两者都很有用,但不是我想要的。那么根据要点的标题,有没有人真的为javascript提出这个?

3 个答案:

答案 0 :(得分:14)

2015年12月,ES7(ES2016)已提出管道运营商。

https://github.com/mindeavor/es-pipeline-operator

答案 1 :(得分:5)

如前所述,已经为ES7(2016)提出了一个管道运营商,但是如果你现在想要使用像babel这样的东西,这对我9个月以后遇到这个问题的方式并没有多大帮助。

据我所知,通过babel支持es-pipeline-operator提案的最大障碍是当前无法使用|><|作为创建语法错误的运算符,如果没有对巴贝尔的改变,不幸的是,问题似乎不会很快得到解决。

我个人希望看到管道后向运算符也添加到提案中,因为前向和后向都适用于不同情况。

例如,我在修改函数时使用管道反向运算符,或者在通常使用的任何地方使用&#34;撰写&#34; over&#34; pipe&#34;在某些情况下我更喜欢它的可读性。

const something = curry <| function(state, pattern) {
  // something
}

const something = function(state, pattern) {
  // something
} |> curry

因为这些管道运算符在函数式javascript编程中非常有用,并且对于那些像我一样现在正在寻找解决方案来使用它的人来说,我已经创建了一个使用按位运算符的babel插件{{1}和<<我很少用它来实现前向和后向管道,并且在极少数需要按位运算符的情况下使用>>指令将禁用某个插件范围。

https://github.com/michaelmitchell/babel-plugin-pipe-composition

答案 2 :(得分:2)

This github repomy favorite issue within it;)只讨论这个问题。

这个提案已经在一小部分想法中移动了几个月,但围绕着使用->::作为Function.prototype.applyFunction.prototype.bind周围的糖,大致。

目前的草稿是::位于范围和功能(instance::method)之间,与instance.method.bind(instance)非常相似,锁定了this范围内的任何功能调用。除此之外,->可以定义为传递范围和参数数组(如apply),因此instance->method(foo, bar)可以去instance.method.apply(instance, [foo, bar])。至少,这是正在讨论的方向之一(披露:这是我的看法)。