Recs.
Updated
Elm is a functional programming language that compiles to HTML, CSS, and Javascript. Its very Haskell-like syntax allows users to build complex event-based systems with an incredibly small amount of concise, readable code, as can be seen from the examples
SpecsUpdate
Pros
Pro Great and simple way to learn Purely Functional Programming
You can try to apply some functional programming ideas in other languages that have an imperative basis, but you haven't seen the real power unless you tried it in the environment of purely functional programming. Elm is a simple language with great learning resources and easy graphical output, which makes it easy to explore the power of functional programming. Plus programming in Elm is very readable.
Pro Haskell-like modules
Elm uses easy to use Haskell-like modules.
Use:
import List
import List as L
import List exposing (..)
import List exposing ( map, foldl )
import Maybe exposing ( Maybe )
import Maybe exposing ( Maybe(..) )
import Maybe exposing ( Maybe(Just) )
Creation:
module MyModule exposing (foo, bar)
Cons
Con Calling out to JavaScript isn't as easy as you'd expect
In order to keep it's safety guarantees, Elm doesn't allow directly calling JS functions via a Foreign Function Interface (FFI). Instead, it exposes a mechanism called "ports" that allow a type-checked async pub/sub-like interface to JS code. This preserves the safety guarantees but can make interop with heavily imperative JS libraries a pain.
Con Not quite Haskell semantics
Elm is a strict language, semantically different from Haskell. Elm also borrows a lot from OCaml and F#. While this makes for a nice syntax, it does mean that, for the Haskell programmer, there may be some surprises when it comes to semantics or function names.
Con Parsing JSON is unintuitive
For the most part, Elm doesn't auto-parse JSON but instead forces you to write your own parsers (called "decoders"). While they give you validation, type safety, and conversion into custom types, they're also very strange and unintuitive when coming from imperative programming.