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