purrr は多くの関連ツールからインスピレーションを得ています。
Haskell の prelude で定義されたリスト操作。
Scala の list methods 。
javascript 用の関数型プログラミングライブラリ: underscore.js 、 lodash および lazy.js 。
rlist, リストの操作をサポートするもう一つのRパッケージ。 目的は似ていますが、哲学はやや異なります。
しかし、purrr の目標は、より純粋な関数型プログラミング言語をRでシミュレートしようとすることではありません。 私たちは、Haskell の二流バージョンをRで実装しようとは思っていません。:
ポイントフリー(暗黙の了解)スタイルの代わりに、パイプ(%>%
)を使って、左から右に読めるコードを書く。 左から右に読めるようなコードを書きます。
curry の代わりに、...
を使って追加の引数を渡します。
Rでは匿名関数は冗長なので、2つの便利なショートハンドを用意しています。 単項関数の場合、~ .x + 1
は function(.x) .x + 1
と同じです。 変形関数のチェーンに対しては、. %>% f() %>% g()
は、function(.) . %>% f() %>% g()
と同等です (このショートカットは magrittr が提供しています)
Rは弱型化されているので、出力の型を記述する map
バリアントが必要です。 (map_int()
, map_dbl()
など)が必要です。 なぜなら、.f
の戻り値の型がわからないからです。
Rには名前付きの引数があるので、マイナーな変化(例:detect()
とdetectLast()
)に別々の関数を用意する代わりに、 名前付きの引数 .right
を使います。 type-stable な関数は推論がしやすいので 引数を追加しても出力の型が変わることはありません。