PureScript Impressions

A couple of days ago I was checking Elm. It’s a very interesting project and I’m curious to see where it’s headed to. While looking for resources about it, I stumbled on PureScript.

While Elm has a syntax that is inspired by Haskell, PureScript’s one is almost identical, to the point that Haskell’s didactic resources can be used to some extent. Since I always wanted to learn Haskell, I think PureScript might be a better match for me than Elm.

What’s PureScript?

The official website keeps it very succint, by writing:

PureScript is a small strongly typed programming language that compiles to JavaScript.

Not much! They probably assume that everyone checking the website is coming from a Haskell background. They also forgot to write in there that it’s a purely functional programming language. I think it’s pretty important.

The language is still very young, so it’s still hard to find examples and learning material. Things are also changing quickly, but I think this is both a problem and something exciting!

So, what does it look like?

Having no experience in Haskell whatsoever, there are things that look weird even in the most simple examples.

This code is taken from the tutorial (try it!):

module Euler1 where

import Prelude

import Data.List (range, filter)  
import Data.Foldable (sum)

ns = range 0 999

multiples = filter (\n -> mod n 3 == 0 || mod n 5 == 0) ns

answer = sum multiples

The language is VERY modular. To the point that without that import Prelude line, you wouldn’t even be able to sum numbers. Crazy! I wonder what’s the choice behind this. I have a hard time imagining a piece of software that won’t use any of these functions.

There’s also a relative lack of parentheses. Functions arguments are listed after the function name, separated only by a space. Parentheses are mainly used for grouping when combining multiple functions.

From what I’ve seen, functions can be used both in prefix and infix position. For example, map is usually used like this:

map (\n -> n + 1) [1, 2, 3, 4]  

But it can also be used as an infix operator by surrounding it with backticks:

(\n -> n + 1) `map` [1, 2, 3, 4]

A similar transformation can be applied to infix operators too: 1 + 1 can become (+) 1 1. But this is no lisp, so don’t try to do something like (+) 1 1 1 1 1 1, as it won’t work ;) The reason becomes clear by looking at the type signature of the function:

(+) :: forall a. (Semiring a) => a -> a -> a

The Semiring part is a class constraint and I’m still not entirely sure of how they work, but the part after the double arrow shows that (+) is a curried function, and that the result is of the same type of the arguments. After applying the two arguments, we don’t have a function anymore but, for example, a Number.

In fact, all functions in PureScript take one argument only.

The Ecosystem

The language is young (there’s a bug in version 0.8.3 that make builds fail!), and so are the tools and libraries. I haven’t spent a lot of time searching, but it seems that PureScript already has its fair share of React frameworks (and some alternatives too).

The End

If I havent’ scared or bored you to death, the next step after the tutorial is to follow PureScript by Example. Good luck!

Related Posts

Adding static files to Yesod

Planning a simple Reddit clone with Yesod

React-router-dom bindings for Reason

Parsing complex foreign objects in PureScript

A way to deal with big objects and FFI.

Post requests with PureScript Affjax and Argonaut

Simple ajax calls to an API example

Functor, Applicative e Monad illustrati

Una guida chiara

Arbitrary length lists with QuickCheck

Using sized to build arbitrary length lists for QuickCheck

Clojure Examples

Toggling DELL 9350's touchpad on Ubuntu 15.10

How to set up a hotkey to toggle DELL 9350's touchpad on Ubuntu 15.10

Using the Asus MB168B+ with Ubuntu 15.10

How to edit the driver install script to make it work on Ubuntu 15.10+ (and other distros)