Haskell influences in CoffeeScript

Written by Liam McLennan

While learning a bit of Haskell I was struck by the syntactical similarites to CoffeeScript. Since Haskell predates CoffeeScript by twenty years (1990/2010) it seems that it is Haskell that has had an influence on CoffeeScript. What follows is a list of the similarities that I have observed.

Binding Variables

In Haskell we can bind a local variable to a scope using the let... in syntax:

circumference r = let pi = 3.14159
                  in  pi * 2 * r

CoffeeScript supports the same thing via the do keyword. One interesting thing about do is that it allows a way to define a variable that is (sort of) not scoped to a function.

circumference = (r) ->
  do (pi = 3.14159) ->
    pi * 2 * r

You can read about some interesting uses of do in Reginald Braithwaite’s CoffeeScript Ristretto.

Significant Whitespace

As you can see in the examples above Haskell and CoffeeScript both use significant whitespace in a similar way.

Expressions > Statements

Both Haskell and CoffeeScript encourage us to favour expressions over statements. CoffeeScript supports statements that aren’t expressions but does everything possible to let you avoid them.

evenness = (i) ->
  if i % 2 is 0
    'even'
  else
    'odd'

Combining this with the do notation we can do

evenness = (i) ->
  do (is_even = (n) -> n % 2 is 0) ->
    if is_even i
      'even'
    else
      'odd'

Comprehensions

Haskell and CoffeeScript have similar syntax for list comprehension. The following Haskell function selects the even elements of a list (x mod 2 == 0) and maps them through a function that multiplies them by two (x*2).

double_odds xs = [x*2 | x <- xs, x `mod` 2 == 0]

The equivalent CoffeeScript is:

double_odds = (xs) ->
  x*2 for x in xs when x % 2 is 0

Function Call Syntax

Both languages use a parenthesis free syntax for applying a function.

Haskell:

add 2 3

CoffeeScript:

add 2, 3

Ranges

For basic incrementing or decrementing integers Haskell and CoffeeScript have the same syntax.

[1..10]

[10..1]

Literate Mode

Haskell and CoffeeScript both support a ‘literate’ mode that emphasizes comments over code.

In CoffeeScript’s literate mode markdown text is interpreted as a comment. Indented text is executed as CoffeeScript code.

Heading
=======

What I need is a function that doubles the even numbers in a list. Here's one!

  double_odds = (xs) ->
    x*2 for x in xs when x % 2 is 0

Haskell’s literate mode uses a > to indicate lines of code.

What I need is a function that doubles the even numbers in a list. Here's one!

> double_odds xs = [x*2 | x <- xs, x `mod` 2 == 0]

That’s all that I can think of, but I’m sure there is more. CoffeeScript is often described as a blend of Ruby and Python that compiles to JavaScript. I think this underplays the influence of Haskell in CoffeeScript’s design.