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.
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_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.