purrr draws inspiration from many related tools:
List operations defined in the Haskell prelude
Scala’s list methods.
Functional programming libraries for javascript: underscore.js, lodash and lazy.js.
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.
Before R 4.1, anonymous functions were verbose, so we provide two
convenient shorthands. For unary functions, ~ .x + 1
is
equivalent to function(.x) .x + 1
.
R is weakly typed, so we need map
variants that
describe the output type (like map_int()
,
map_dbl()
, etc) because we don’t know the return type of
.f
.
R has named arguments, so instead of providing different
functions for minor variations (e.g. detect()
and
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.