Skip to main content

cs4140 Notes: 10 FP and Deploying

·2 mins

Functional Programming in Elixir #

Intro:

  • Elixir is built on the Erlang Virtual Machine
  • Elixir has basically the same semantics and behavior as Erlang with different syntax and a more modern and familiar standard libary.
  • The main design goal of Erlang was reliability, which lead to two focuses different from other languages: functional programming and a focus on distributed/concurrent applications.
  • We’ll talk more about reliability, concurrency, and distributed apps later.

Elixir is a Functional language

Functional languages have three key properties:

  • First class functions, but most modern languages do that
  • Immutable data
  • Pure functions

This has some benefits:

  • This style of function is similar to mathematical functions and allows for mathmatical reasoning.
  • In a pure function, functions always give the same output for the same input.
  • That makes testing easy: testing outputs for inputs is the whole testing process.
  • That means you can do tricks like memoization, where once you compute a function for a given input once you can cache that result.
  • Composability: Functions combine in predictable ways that you can reason about without worrying about side effects or implicit state.

Having the language enforce this has some downsides:

  • You can’t mutate a loop index, so all repetition must be done by recursion rather than looping.
  • Really pure functions mean no side effects. Elixir doesn’t go that far in general, but it does force all state to be made implicit.
  • You need to think in a functional style. You’re always producing a new object rather than modifying an object, and you produce it “all at once” rather than as a sequence of modifications.

Example: Compare the two version of addOneToAll(List) in Python, then show in Elixir.

Server-side web apps conceptually map well to pure functions:

  • Version 1: The web app server is a pure function mapping an HTTP request to an HTTP response.
  • Version 2: The web server is a pure function mapping an HTTP request to a list of database actions, followed by a pure function mapping the request and the database query results to a response.
  • In Phoenix, controller actions are impure functions if they do DB queries, but most of the rest of the work are various pure functions (e.g. templates are pure).

Deployment #

We’re going to build deployment scripts for Party Animal and use them to deploy our latest change. This should result in full documentation of the (dev mode) deployment process.