purrr draws inspiration from many related tools:
List operations defined in the Haskell prelude
Scala’s list methods.
rlist, another R package to support working with lists. Similar goals but somewhat different philosophy.
However, the goal of purrr is not to try and simulate a purer functional programming language in R; we don’t want to implement a second-class version of Haskell in R. The goal is to give you similar expressiveness to an FP language, while allowing you to write code that looks and works like R:
Instead of point free (tacit) style, we use the pipe,
%>%, to write code that can be read from left to right.
Instead of currying, we use
... to pass in extra arguments.
Anonymous functions are verbose in R, so we provide two convenient shorthands. For unary functions,
~ .x + 1 is equivalent to
function(.x) .x + 1. For chains of transformations functions,
. %>% f() %>% g() is equivalent to
function(.) . %>% f() %>% g() (this shortcut is provided by magrittr).
R is weakly typed, so we need
map variants that describe the output type (like
map_dbl(), etc) because we don’t know the return type of
R has named arguments, so instead of providing different functions for minor variations (e.g.
detectLast()) we use a named argument,
.right. Type-stable functions are easy to reason about so additional arguments will never change the type of the output.