Permalink
Cannot retrieve contributors at this time
--- | |
title: "Functional programming in other languages" | |
output: rmarkdown::html_vignette | |
vignette: > | |
%\VignetteIndexEntry{Functional programming in other languages} | |
%\VignetteEngine{knitr::rmarkdown} | |
%\VignetteEncoding{UTF-8} | |
--- | |
purrr draws inspiration from many related tools: | |
* List operations defined in the Haskell [prelude][haskell] | |
* Scala's [list methods][scala]. | |
* Functional programming libraries for javascript: | |
[underscore.js](http://underscorejs.org), | |
[lodash](https://lodash.com) and | |
[lazy.js](http://danieltao.com/lazy.js/). | |
* [rlist](http://renkun.me/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. | |
[scala]:http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.List | |
[haskell]:http://hackage.haskell.org/package/base-4.7.0.1/docs/Prelude.html#g:11 |