Skip to content

Lists in PureScript

In PureScript it is important to differentiate Lists and Arrays. While Arrays are compiled into JavaScript Arrays when building, Lists are more like our typical linked-lists, and not translated to Arrays under the hood.

myList = 1 : 2 : 3 : Nil
myArray = [1, 2, 3]
:type myList
--- List Int
:type myArray
--- Array Int

When building the bundle, our Array is translated to the following JS code:

var myArray = [ 1, 2, 3 ];

Let’s go over the most important functions to work with Lists: head, tail, cons, snoc, null, singleton, length, last & index.

Our linked list is build up like this: (1 (2 (3 (Nil)))) As you can see, next to the 1 is the complete rest of the list. Next to the 2 is the complete rest of the list, and so on. This rest is called the tail - the element “on top” is the head.

So, the head of the tail of myList is 2.

head myList

Gives us “Just 1”, and

tail myList

gives us “(Just (2 : 3 : Nil))“.

Another pair of function - cons puts takes a list as the first parameter, and an element as the second parameter. This element is added as the head to the list.

Cons 1 (2 : 3 : Nil)
--- (1 : 2 : 3 : Nil)

snoc adds the provided element to the end of the list.

snoc (1 : 2 : 3 : Nil) 4
--- (1 : 2 : 3 : 4 : Nil)

Important: Cons is written with an uppercase “C”, and the to-be-added element is the first parameter. For snoc, the to-be-added element is the second parameter.

Returns true, if the provided list is empty, and false, if this is not the case.

null (1 : Nil)
--- false
null (Nil)
--- true

Returns a list with a single element in it (Nil doesn’t count)

singleton (1 : 2 : Nil)
--- ((1 : 2 : Nil) : Nil)

Returns the number of elements in the list provided

length (1 : 2 : 3 : Nil)
--- 3

Returns the last element of the list

last (1 : 2 : 3 : Nil)
--- (Just 3)

For accessing a value behind the provided index. Counting starts at 0, so index 1 is the second element:

index (1 : 2 : 3 : Nil) 1
--- (Just 2)

Based on a list of lists, this function concatenates the given lists:

concat ((1 : 2 : Nil) : (3 : Nil) : Nil)
--- (1 : 2 : 3 : Nil)