Lists
Lists are zero-terminated, nested row 2-tuples. They are declared by prepending a ~
to what looks like row syntax, like this: ~[]
(in the REPL we have to wrap this in parentheses):
NIL
(NIL)
> NIL
Evaluates to 0.
NIL == 0 ; the empty list
CONS
(CONS x xs)
> x : a
> xs : List a
> List a
Constructs a new list by adding an element to the front of an existing list.
CONS 1 NIL == [1 0] ; a list with one element
CONS b#a (CONS b#b NIL) == [b#a [b#a 0]] ; a list with two elements
CONS 1 (CONS 2 (CONS 3 NIL)) == [1 [2 [3 0]]] ; a list with three elements
listCase
(listCase xs d k)
> xs : List a
> d : a
> k : a
> a
Pattern matches on a list, providing cases for empty and non-empty lists.
listCase ~[1 69 420 1337] 9001 listIdx == 420
listSing
(listSing x)
> x : a
> List a
Creates a singleton list containing one element.
listSing 5 == [5 0]
listSing b#hello == [b#hello 0]
listSing [] == [[] 0]
listMap
(listMap f xs)
> f : (a > b)
> xs : List a
> List b
Applies a function to every element of a list.
listMap (mul 2) ~[1 2 3] == [2 [4 [6 0]]]
listMap isNat (CONS 3 (CONS b#a NIL)) == [1 [0 0]]
listMap id NIL == 0 ; NIL
listForEach
(listForEach xs f)
> xs : List a
> f : (a > b)
> List b
Alias for listMap
. Applies a function to every element of a list.
listForEach (CONS 1 (CONS 2 (CONS 3 NIL))) (mul 2) == [2 [4 [6 0]]]
listForEach (~[3 [b#a 0]]) isNat == [1 [0 0]]
listForEach NIL id == NIL
listHead
(listHead xs)
> xs : List a
> a
Returns the first element of a list.
listHead (CONS 2 (CONS 3 NIL)) == (0 2)
listHead (CONS b#a NIL) == (0 b#a)
listHead NIL == 0
listSafeHead
(listSafeHead d xs)
> d : a
> xs : List a
> a
Returns the first element of a list, or a fallback value if the list is empty.
listSafeHead 0 (CONS 1 (CONS 2 NIL)) == 1
listSafeHead b#x (CONS b#a NIL) == b#a
listSafeHead b#default NIL == b#default
listUnsafeHead
(listUnsafeHead xs)
> xs : List a
> a
Returns the first element of a list, otherwise 0. Unsafe if the list is empty.
listUnsafeHead (CONS 1 (CONS 2 NIL)) == 1
listUnsafeHead (CONS b#a NIL) == b#a
listUnsafeHead NIL == 0 ; NIL
listUnsafeTail
(listUnsafeTail xs)
> xs : List a
> List a
Returns the tail of a list (all elements except the first). Unsafe if the list is empty.
listUnsafeTail (CONS 1 (CONS 2 NIL)) == [2 0]
listUnsafeTail (CONS b#a NIL) == 0
listUnsafeTail NIL == 0 ; NIL
listIdxCps
(listIdxCps i xs d k)
> i : Nat
> xs : List a
> d : a
> k : (a > b)
> a
Continuation-passing style function to get the element at a given index in a list.
listIdxCps 1 (CONS b#a (CONS b#b NIL)) b#{not found} id == b#b
listIdxCps 0 (CONS 1 NIL) b#{not found} id == 1
listIdxCps 2 (CONS 1 (CONS 2 NIL)) b#{not found} id == b#{not found}
listIdxOr
(listIdxOr d i xs)
> d : a
> i : Nat
> xs : List a
> a
Returns the element at a given index in a list, or a fallback value if the index is out of bounds.
listIdxOr 0 1 (CONS b#a (CONS b#b NIL)) == b#b
listIdxOr b#z 99 (CONS b#a (CONS b#b NIL)) == b#z
listIdxOr b#default 0 NIL == b#default
listIdx
(listIdx i xs)
> i : Nat
> xs : List a
> a
Returns the element at a given index in a list, or 0 if the index is out of bounds.
listIdx 1 (CONS b#a (CONS b#b NIL)) == b#b
listIdx 0 (CONS 1 NIL) == 1
listIdx 2 (CONS 1 (CONS 2 NIL)) == 0
listLastOr
(listLastOr d xs)
> d : a
> xs : List a
> a
Returns the last element of a list, or a fallback value if the list is empty.
listLastOr 0 (CONS 1 (CONS 2 NIL)) == 2
listLastOr b#z ~[b#a 0] == 0
listLastOr b#z ~[] == b#z
listUnsafeLast
(listUnsafeLast xs)
> xs : List a
> a
Returns the last element of a list. Unsafe if the list is empty.
listUnsafeLast (CONS 1 (CONS 2 NIL)) == 2
listUnsafeLast (CONS b#a NIL) == b#a
listUnsafeLast NIL == 0 ; NIL
listLast
(listLast xs)
> xs : List a
> a
Returns the last element of a list.
listLast (CONS 1 (CONS 2 NIL)) == (0 2)
listLast ~[b#a] == (0 b#a)
listLast NIL == 0
listFoldl
(listFoldl f z xs)
> f : (b > a > b)
> z : b
> xs : List a
> b
Left-associative fold of a list.
listFoldl add 0 ~[1 2 3] == 6
listFoldl barWeld b#{} ~[b#a b#b b#c] == b#abc
listFoldl (flip CONS) NIL ~[1 2 3] == [3 [2 [1 0]]]
listFoldl1
(listFoldl1 f xs)
> f : (a > a > a)
> xs : List a
> a
Left-associative fold of a non-empty list, using the first element as the initial accumulator.
listFoldl1 add ~[2 3 4] == 9
listFoldl1 max (CONS 1 (CONS 5 (CONS 3 NIL))) == 5
listFoldl1 barWeld ~[b#a b#b b#c] == b#abc
listFoldr
(listFoldr f z xs)
> f : (a > b > b)
> z : b
> xs : List a
> b
Right-associative fold of a list.
listFoldr sub 0 (~[1 2 3]) == 1
listFoldr barWeld b#{} ~[b#a b#b b#c] == b#abc
listFoldr (flip CONS) NIL ~[1 2 3] == [[[0 3] 2] 1]
listLen
(listLen xs)
> xs : List a
> Nat
Computes the length of a list.
listLen (CONS 1 (CONS 2 (CONS 3 NIL))) == 3
listLen (CONS b#a NIL) == 1
listLen NIL == 0
listToRow
(listToRow xs)
> xs : List a
> Row a
Converts a list to a row.
listToRow ~[1 2 3] == [1 2 3]
listToRow (CONS b#a (CONS b#b NIL)) == [b#a b#b]
listToRow NIL == []
sizedListToRow
(sizedListToRow n xs)
> n : Nat
> xs : List a
> Row a
Converts a list to a row of a specified size, padding with zeros if necessary.
sizedListToRow 3 ~[1 2] == [1 2 0]
sizedListToRow 2 (CONS 1 (CONS 2 (CONS 3 NIL))) == [1 2]
sizedListToRow 4 NIL == [0 0 0 0]
sizedListToRowRev
(sizedListToRowRev n xs)
> n : Nat
> xs : List a
> Row a
Converts a list to a row of a specified size in reverse order, padding with zeros if necessary.
sizedListToRowRev 3 (CONS 1 (CONS 2 NIL)) == [0 2 1]
sizedListToRowRev 2 ~[1 2 3] == [2 1]
sizedListToRowRev 4 NIL == [0 0 0 0]
listToRowRev
(listToRowRev xs)
> xs : List a
> Row a
Converts a list to a row in reverse order.
listToRowRev (CONS 1 (CONS 2 (CONS 3 NIL))) == [3 2 1]
listToRowRev (~[b#a b#b]) == [b#b b#a]
listToRowRev NIL == []
listFromRow
(listFromRow xs)
> xs : Row a
> List a
Converts a row to a list.
listFromRow [1 2 3] == [1 [2 [3 0]]]
listFromRow [b#a b#b] == [b#a [b#b 0]]
listFromRow (gen 4 id) == [0 [1 [2 [3 0]]]]
listAnd
(listAnd xs)
> xs : List Bool
> Bool
Returns TRUE if all elements in the list are TRUE, otherwise FALSE.
listAnd (CONS TRUE (CONS TRUE NIL)) == 1 ; TRUE
listAnd (CONS TRUE (CONS FALSE NIL)) == 0 ; FALSE
listAnd NIL == 1 ; TRUE
listOr
(listOr xs)
> xs : List Bool
> Bool
Returns TRUE if any element in the list is TRUE, otherwise FALSE.
listOr (CONS FALSE (CONS TRUE NIL)) == 1 ; TRUE
listOr ~[FALSE 0] == 0 ; FALSE
listOr NIL == 0 ; FALSE
listSum
(listSum xs)
> xs : List Nat
> Nat
Computes the sum of all elements in a list of numbers.
listSum (CONS 1 (CONS 2 (CONS 3 NIL))) == 6
listSum (~[1 2 3]) == 6
listSum NIL == 0
listAll
(listAll f xs)
> f : (a > Bool)
> xs : List a
> Bool
Returns TRUE if all elements in the list satisfy the given predicate.
listAll even (CONS 2 (CONS 4 (CONS 6 NIL))) == 1 ; TRUE
listAll (gte 1) (~[1 2 3]) == 0 ; FALSE
listAll id NIL == 1 ; TRUE
listAllEql
(listAllEql xs)
> xs : List a
> Bool
Returns TRUE if all elements in the list are equal.
listAllEql (CONS 1 (CONS 1 (CONS 1 NIL))) == 1 ; TRUE
listAllEql (~[b#a b#a]) == 1 ; TRUE
listAllEql (CONS 1 (CONS 2 NIL)) == 0 ; FALSE
listAny
(listAny f xs)
> f : (a > Bool)
> xs : List a
> Bool
Returns TRUE if any element in the list satisfies the given predicate.
listAny odd (CONS 2 (CONS 3 (CONS 4 NIL))) == 1 ; TRUE
listAny (gte 0) (~[1 2 3]) == 0 ; FALSE
listAny id NIL == 0 ; FALSE
listHas
(listHas e xs)
> e : a
> xs : List a
> Bool
Checks if a list contains a specific element.
listHas 2 (CONS 1 (CONS 2 (CONS 3 NIL))) == 1 ; TRUE
listHas b#a (CONS b#b (CONS b#c NIL)) == 0 ; FALSE
listHas 1 NIL == 0 ; FALSE
listEnumFrom
(listEnumFrom x)
> x : Nat
> List a
Creates an infinite list of consecutive integers starting from a given number.
listTake 5 (listEnumFrom 1) == [1 [2 [3 [4 [5 0]]]]]
listHead (listEnumFrom 10) == (0 10) ; SOME
listIdx 1 (listEnumFrom 7) == 8
listWeld
(listWeld xs ys)
> xs : List a
> ys : List a
> List a
Concatenates two lists.
listWeld (CONS 1 (CONS 2 NIL)) (CONS 3 (CONS 4 NIL)) == [1 [2 [3 [4 0]]]]
listWeld ~[b#a] ~[b#b] == [b#a [b#b 0]]
listWeld NIL (CONS 1 NIL) == [1 0]
listCat
(listCat xss)
> xss : List (List a)
> List a
Concatenates a list of lists into a single list.
listCat ~[~[1 2] ~[3]] == [1 [2 [3 0]]]
listCat (CONS NIL (CONS NIL NIL)) == 0 ; NIL
listCatMap
(listCatMap f xs)
> f : (a > List b)
> xs : List a
> List b
Applies a function to all elements in a list and concatenates the results.
listCatMap (x & ~[x x]) ~[1 2] == [1 [1 [2 [2 0]]]]
listCatMap (x & ~[x]) ~[b#a b#b] == [b#a [b#b 0]]
listCatMap (x & ~[]) ~[1 2 3] == 0 ; NIL
listTake
(listTake n xs)
> n : Nat
> xs : List a
> List a
Takes the first n elements from a list.
listTake 2 (CONS 1 (CONS 2 (CONS 3 NIL))) == [1 [2 0]]
listTake 3 ~[1 2] == [1 [2 0]]
listTake 0 (CONS 1 NIL) == 0 ; NIL
listDrop
(listDrop n xs)
> n : Nat
> xs : List a
> List a
Drops the first n elements from a list.
listDrop 2 (CONS 1 (CONS 2 (CONS 3 NIL))) == [3 0]
listDrop 3 ~[1 2] == 0 ; NIL
listDrop 0 (CONS 1 NIL) == [1 0]
listTakeWhile
(listTakeWhile f xs)
> f : (a > Bool)
> xs : List a
> List a
Takes elements from the front of a list while they satisfy a predicate.
listTakeWhile (gte 2) (CONS 1 (CONS 2 (CONS 3 (CONS 4 NIL)))) == [1 [2 0]]
listTakeWhile even ~[2 4 5 6] == [2 [4 0]]
listTakeWhile (const TRUE) NIL == 0 ; NIL
listDropWhile
(listDropWhile f xs)
> f : (a > Bool)
> xs : List a
> List a
Drops elements from the front of a list while they satisfy a predicate.
listDropWhile (gte 2) (CONS 1 (CONS 2 (CONS 3 (CONS 4 NIL)))) == [3 [4 0]]
listDropWhile even ~[2 4 5 6] == [5 [6 0]]
listDropWhile (const TRUE) NIL == 0 ; NIL
listZipWith
(listZipWith f xs ys)
> f : (a > a > b)
> xs : List a
> ys : List a
> List b
Combines two lists element-wise using a given function.
listZipWith add (CONS 1 (CONS 2 NIL)) (CONS 3 (CONS 4 NIL)) == [4 [6 0]]
listZipWith v2 ~[1 2 3] ~[4 5] == [[1 4] [[2 5] 0]]
listZipWith mul NIL (CONS 1 NIL) == 0 ; NIL
listZip
(listZip xs ys)
> xs : List a
> ys : List a
> List (a, a)
Combines two lists into a list of pairs.
listZip (CONS 1 (CONS 2 NIL)) (CONS 3 (CONS 4 NIL)) == [[1 3] [[2 4] 0]]
listZip ~[1 2 3] ~[4 5] == [[1 4] [[2 5] 0]]
listZip NIL (CONS 1 NIL) == 0 ; NIL
listFilter
(listFilter f xs)
> f : (a > Bool)
> xs : List a
> List a
Keeps only the elements of a list that satisfy a predicate.
listFilter even (CONS 1 (CONS 2 (CONS 3 (CONS 4 NIL)))) == [2 [4 0]]
listFilter (lte 3) ~[1 2 3 4 5] == [3 [4 [5 0]]]
listFilter (const TRUE) NIL == 0 ; NIL
listIsEmpty
(listIsEmpty xs)
> xs : List a
> Bool
Checks if a list is empty.
listIsEmpty NIL == 1 ; TRUE
listIsEmpty (CONS 1 NIL) == 0 ; FALSE
listIsEmpty (CONS 1 (CONS 2 NIL)) == 0 ; FALSE
listMinimumOn
(listMinimumOn f x xs)
> f : (a > Nat)
> x : a
> xs : List a
> a
Finds the minimum element in a list based on a comparison function.
listMinimumOn len [456] ~[[5 2 9] [2 9] [1 9]] == [456]
listMinimumOn len [456] ~[[5 2 9] [] [1 9]] == []
listMinimumOn len [456] ~[[5 2 9] [2] [1 9]] == [456]
listSortOn
(listSortOn f xs)
> f : (a > b)
> xs : List a
> List b
Sorts a list based on a key function.
listSortOn id (CONS 3 (CONS 1 (CONS 2 NIL))) == [1 [2 [3 0]]]
listSortOn (div 1) ~[1 2 3] == [3 [2 [1 0]]]
listSortOn len ~[[1 2] [3] [4 5 6]] == [[3] [[1 2] [[4 5 6] 0]]]
listNub
(listNub xs)
> xs : List a
> List a
Removes duplicate elements from a list, keeping only the first occurrence.
listNub (CONS 1 (CONS 2 (CONS 1 (CONS 3 NIL)))) == [1 [2 [3 0]]]
listNub ~[3 2 1 2 1] == [3 [2 [1 0]]]
listNub NIL == 0 ; NIL
listIterate
(listIterate f x)
> f : (a > a)
> x : a
> List a
Generates an infinite list by repeatedly applying a function to an initial value.
listTake 5 (listIterate inc 0) == [0 [1 [2 [3 [4 0]]]]]
listTake 3 (listIterate (mul 2) 1) == [1 [2 [4 0]]]
listTake 0 (listIterate id 1) == 0 ; NIL
listGen
(listGen n f)
> n : Nat
> f : (a > a)
> List a
Generates a list of n elements using a given function.
listGen 3 id == [0 [1 [2 0]]]
listGen 4 (const b#a) == [b#a [b#a [b#a [b#a 0]]]]
listGen 0 (const 1) == 0 ; NIL
listRep
(listRep e n)
> e : a
> n : Nat
> List a
Generates a list of n copies of a given element.
listRep 1 3 == [1 [1 [1 0]]]
listRep b#a 2 == [b#a [b#a 0]]
listRep 0 0 == 0 ; NIL
listFindIndex
(listFindIndex f xs d m)
> f : (a > b)
> xs : List a
> d : b
> k : (Nat > b)
> a
Finds the index of the first element in a list that satisfies a predicate. If there is none, the third argument is returned. If there is one, then its index is passed as an argument to the fourth argument.
listFindIndex eql-10 ~[1 2 3] b#NONE _&(b#SOME) == b#NONE
listFindIndex (eql b#a) ~[b#b b#a b#c] NONE SOME == (0 1) ; SOME
listFindIndex (const FALSE) ~[1 2 3] NONE SOME == 0 ; NONE
listElemIndex
(listElemIndex e xs d k)
> e : a
> xs : List a
> d : b
> k : (a > b)
> b
Finds the index of the first occurrence of an element in a list.
listElemIndex 2 (CONS 1 (CONS 2 (CONS 3 NIL))) NONE SOME == (0 1)
listElemIndex b#a ~[b#b b#c b#c b#a] NONE SOME == (0 3)
listElemIndex 4 ~[1 2 3] NONE SOME == 0
listIsPrefixOf
(listIsPrefixOf xs ys)
> xs : List a
> ys : List a
> Bool
Checks if one list is a prefix of another list.
listIsPrefixOf (CONS 1 (CONS 2 NIL)) (CONS 1 (CONS 2 (CONS 3 NIL))) == 1 ; TRUE
listIsPrefixOf ~[1 2] ~[1 2 3] == 1 ; TRUE
listIsPrefixOf ~[1 2] ~[2 1] == 0 ; FALSE
listSearch
Searches for all occurrences of a list satisfying a predicate and returns their indices and the remaining lists.
TODO
listSubstringSearch
Searches for all occurrences of a substring in a list and returns their indices and the remaining lists.
TODO
listIndexed
(listIndexed xs)
> xs : List a
> List (Row a)
Pairs each element in a list with its index.
listIndexed (CONS 1 (CONS 2 (CONS 3 NIL))) == [[0 1] [[1 2] [[2 3] 0]]]
listIndexed ~[b#a b#b] == [[0 b#a] [[1 b#b] 0]]
listIndexed NIL == 0 ; NIL
listIntersperse
(listIntersperse e xs)
> e : a
> xs : List a
> List a
Intersperses an element between every element of a list.
listIntersperse 0 (CONS 1 (CONS 2 (CONS 3 NIL))) == [1 [0 [2 [0 [3 0]]]]]
listIntersperse b#a ~[b#b] == [b#b 0]
listIntersperse 0 NIL == 0 ; NIL
listRev
(listRev xs)
> xs : List a
> List a
Reverses a list.
listRev (CONS 1 (CONS 2 (CONS 3 NIL))) == [3 [2 [1 0]]]
listRev ~[b#a b#b] == [b#b [b#a 0]]
listRev NIL == 0 ; NIL
listSnoc
(listSnoc xs e)
> xs : List a
> e : a
> List a
Adds an element to the end of a list.
listSnoc (CONS 1 (CONS 2 NIL)) 3 == [1 [2 [3 0]]]
listSnoc ~[b#a] b#b == [b#a [b#b 0]]
listSnoc NIL 1 == [1 0]
listProd
(listProd xs ys)
> xs : List a
> ys : List b
> List (Row a b)
Computes the Cartesian product of two lists.
listProd (CONS 1 (CONS 2 NIL)) (CONS 3 (CONS 4 NIL)) == [[1 3] [[1 4] [[2 3] [[2 4] 0]]]]
listProd ~[1 2] ~[b#a b#b] == [[1 b#a] [[1 b#b] [[2 b#a] [[2 b#b] 0]]]]
listProd NIL (CONS 1 NIL) == 0 ; NIL