歩いたら休め

なんでこんな模様をしているのですか?

【R】パイプ演算子ってdplyrやmagrittr独自の機能じゃなくて、F#が元ネタなんだね

Rのプログラマーは「Rって独特な言語だから、R言語独自の機能が多くて他の言語に応用が効かない」とか言いがちですが、そんなことは無いと思います。関数型言語Scheme)の影響が強いので、ちょっと立ち位置は遠いのかもしれませんが。

例えば、以前私が「最近Python高階関数やリスト内包表記を使いこなせるようになったからfor文使わなくなってきた」と言ったら、「Rプログラマーみたいなこと言うね」と言われたのですが、map(Rならapply系の関数)は大抵のスクリプト言語全般で使えますし、そんなに特別なことではないはずです。

R独自に思える機能の一つに、パイプ演算子%>%というものがあります。Rというより、代表的なライブラリであるdplyrmagrittrの機能ですけど。

github.com

これも実は、githubの説明文に、「F#の|>演算子を使えるようにしたものだよ」と書いてあります(つまり、完全なオリジナルのアイデアではありません)。また、Elixir等の関数型言語を中心に、他言語でも実装されているものがいくつかあるようです。

R package to bring forward-piping features ala F#'s |> operator. Ceci n'est pas un pipe.

というわけで、他言語のパイプ事情をざっと調べてみました。

F#

全ての元ネタです。パイプ「ライン」演算子と呼ばれることが多いみたいですね。

Javaに対するScalaC#に対するF#」みたいな立ち位置の言語だと聞いています。

neue cc - F#

F#といったらパイプライン演算子パイプラインは文化。と、いうわけかで、実際、私がよく目にしているF#のコードというのは基本|>で繋ぐ、という形であり、それが実にイイなー。などという憧憬はあるのでF#を書くとなったらとりあえずまずはパイプライン演算子の学習から入ったりなどしたりする。

こんな感じになるそうです。

Functions (F#)

let function1 x = x + 1
let function2 x = x * 2
let result = 100 |> function1 |> function2
// 答えは202

Elixir

qiita.com

その他の関数型言語(OCaml, Haskellなど)

元々実装されているわけではありませんが、似た機能を簡単に作ることができます。

blog.kokuyouwind.com

d.hatena.ne.jp

ocaml-nagoya.g.hatena.ne.jp

nenono.hatenablog.com

Ruby

実装できなくはないが、元々メソッドチェーンしやすい言語なのでそんなにメリットないかも…。

qiita.com

yuroyoro.hatenablog.com

Python

この中では珍しく、Rのパイプ演算子をpandasでも使いたいというモチベーションの記事です。

sinhrks.hatenablog.com

pod.hatenablog.com

なんか書いてますが英語なのでよく分かりません。

Pipelining in Pythonmtomassoli.wordpress.com

JavaScript

ライブラリがあるっぽいです。

github.com

気になるのはこの一文。

This proposal introduces a new operator |> similar to F#, OCaml, Elixir, Elm, Julia, and LiveScript, as well as UNIX pipes. It's a backwards-compatible way of streamlining chained function calls in a readable, functional manner, and provides a practical alternative to extending built-in prototypes.

数値計算用言語のJuliaでもパイプライン処理が存在する?

Julia

Put This In Your Pipe

よくわかりませんでした…。

調べた結果

F#とElixirでパイプライン演算子が広く使われていて、ライブラリも含めるとRのプログラマーもパイプ処理を使いこなしている人が多いです。ユーザー数でいうとRは関数型言語としてももうちょっと存在感出していい気がするんだけど、F#やElixirのプログラマーR言語の存在に気づいて無さそう…。