Rows
This page is under active development. It may contain bugs or incomplete descriptions.
TODO: Update with function and type signatures.
This module defines operations on rows, which are data-jetted arrays. Since PLAN is untyped, these are also used as the building blocks for tuples, records, and datatypes.
They are defined with []:
arr=[10 64 42]
arr
[10 64 42]null
(null xs)
> xs : Row a
> BoolChecks if a row is empty.
null returns TRUE if the given row is empty, and FALSE otherwise.
null [] == 1
null [1 2 3] == 0
null [0] == 0arity
(arity x)
> x : a
> NatReturns the arity of a function or row.
arity returns the number of arguments a function takes, or the number of elements in a row plus one.
arity add == 2
arity [1 2 3] == 4
arity [] == 1len
(len xs)
> xs : Row a
> NatReturns the length of a row.
len counts the number of elements in a given row.
len [1 2 3] == 3
len [] == 0
len [9] == 1idx
(idx i xs)
> i : Nat
> xs : Row a
> aRetrieves an element from a row at a specified index.
idx returns the element at the given index in the row. Indexing starts at 0.
idx 1 [10 20 30] == 20
idx 0 [5 6 7] == 5
idx 2 [1] == 0 (out of bounds)last
(last xs)
> xs : Row a
> aRetrieves an element from the end of a row.
last [10 20 30] == 30
last [5 6 7] == 7
last [] 2 == 0get
(get xs i)
> xs : Row a
> i : Nat
> aRetrieves an element from a row at a specified index.
get is an alias for idx. It returns the element at the given index in the row.
get [10 20 30] 1 == 20
get [5 6 7] 0 == 5
get [1] 2 == 0 (out of bounds)mut
(mut i v xs)
> i : Nat
> v : a
> xs : Row a
> Row aModifies an element in a row at a specified index.
mut returns a new row with the element at the given index replaced by the provided value.
mut 1 99 [10 20 30] == [10 99 30]
mut 0 5 [1 2 3] == [5 2 3]
mut 3 4 [1 2] == [1 2 0 4]put
(put xs i v)
> xs : Row a
> i : Nat
> v : a
> Row aModifies an element in a row at a specified index.
put is an alias for mut. It returns a new row with the element at the given index replaced by the provided value.
put [10 20 30] 1 99 == [10 99 30]
put [1 2 3] 0 5 == [5 2 3]
put [1 2] 3 4 == [1 2 0 4]switch
(switch i d xs)
> i : Nat
> d : b
> xs : Row a
> aSelects a value from a row based on an index, with a fallback value.
switch returns the element at the given index if it exists, otherwise it returns the fallback value.
switch 1 0 [10 20 30] == 20
switch 3 0 [10 20 30] == 0 (fallback)
switch 0 99 [] == 99 (fallback)c0, c1, c2, c3, c4, c5, c6, c7, c8, c9
Creates a row constructor of the specified arity.
These functions create row constructors of arity 0 to 9 respectively.
c3 1 2 3 == [3 2 1]
c0 == []
c2 b#a b#b == [b#b b#a]v0, v1, v2, v3, v4, v5, v6, v7, v8, v9
Creates a row of the specified arity.
These functions create rows of arity 0 to 9 respectively, with the arguments in reverse order.
v3 1 2 3 == [1 2 3]
v0 == []
v2 b#a b#b == [b#a b#b]isRow
(isRow x)
> x : a
> BoolChecks if a value is a row.
isRow returns TRUE if the given value is a row, and FALSE otherwise.
isRow [1 2 3] == 1
isRow [] == 1
isRow 3 == 0foldr
(foldr f xs)
> f : (a > b)
> xs : Row a
> bFolds a row from right to left.
foldr applies a binary function to a starting value (from the right) and all elements of the row, going from right to left.
foldr sub 0 [1 2 3] == 1
foldr v2 [] [1 2 3] == [1 [2 [3 []]]]
foldr add 0 [] == 0foldl
(foldl f xs)
> f : (a > b)
> xs : Row a
> bFolds a row from left to right.
foldl applies a binary function to a starting value (from the left) and all elements of the row, going from left to right.
foldl sub 0 [1 2 3] == 0
foldl v2 [] [1 2 3] == [[[[] 1] 2] 3]
foldl add 0 [1] == 1foldr1
(foldr1 f xs)
> f : (a > b)
> xs : Row a
> bFolds a non-empty row from right to left using the last element as the initial accumulator.
foldr1 sub [1 2 3 10] == 0
foldr1 strWeld [%a %b %c] == %abc
foldr1 max [1 5 3 2] == 5unfoldr
(unfoldr f s)
> f : (a > b)
> s : a
> aBuilds a row from a seed value using a function that returns either a value and a new seed, or nothing.
unfoldr n&(if (gth n 0) (SOME [n dec-n]) NONE) 5 == [5 4 3 2 1]
unfoldr n&(if (lth n 3) (SOME [n inc-n]) NONE) 0 == [0 1 2]
unfoldr _&NONE 0 == []strictRow
(strictRow x)
> x : a
> Row aForces evaluation of all elements in a row.
strictRow [1 2 3] == [1 2 3] ; ensures all elements are evaluated
strictRow (map (mul 2) [1 2 3]) == [2 4 6] ; forces computation
strictRow [] == []weld
(weld xs ys)
> xs : Row a
> ys : Row a
> Row aConcatenates two rows.
weld combines two rows into a single row, with the elements of the first row followed by the elements of the second row.
weld [1 2] [3 4] == [1 2 3 4]
weld [] [5 6] == [5 6]
weld [1 2] [] == [1 2]gen
(gen l f)
> l : Nat
> f : (Nat > a)
> Row aGenerates a row based on a function and a length.
gen creates a row of the specified length, where each element is the result of applying the given function to its index.
gen 3 (add 2) == [2 3 4]
gen 4 id == [0 1 2 3]
gen 0 | mul 2 == []fst
(fst xs)
> xs : Row a
> aReturns the first element of a row.
fst retrieves the leftmost element of a given row.
fst [1 2 3] == 1
fst [9] == 9
fst [] == 0snd
(snd xs)
> xs : Row a
> aReturns the second element of a row.
snd retrieves the second element of a given row. If the row has fewer than two elements, it returns 0.
snd [1 2 3] == 2
snd [9] == 0
snd [] == 0thr
(thr xs)
> xs : Row a
> aReturns the third element of a row.
thr retrieves the third element of a given row. If the row has fewer than three elements, it returns 0.
thr [1 2 3 4] == 3
thr [1 2] == 0
thr [] == 0map
(map f xs)
> f : (a > b)
> xs : Row a
> Row bApplies a function to each element of a row.
map creates a new row by applying the given function to each element of the input row.
map (mul 2) [1 2 3] == [2 4 6]
map fst [[1 2] [3 4] [5 6]] == [1 3 5]
map (add 1) [] == []foreach
(foreach xs f)
> xs : Row a
> f : (a > b)
> Row bAlias for map with arguments reversed.
foreach is an alias for map. It applies a function to each element of a row.
foreach [1 2 3] (mul 2) == [2 4 6]
foreach [[1 2] [3 4] [5 6]] fst == [1 3 5]
foreach [] (add 1) == []rev
(rev xs)
> xs : Row a
> Row aReverses a row.
rev creates a new row with the elements of the input row in reverse order.
rev [1 2 3] == [3 2 1]
rev [9] == [9]
rev [] == []curry
(curry f x y)
> f : (Row a > b)
> x : a
> y : a
> aConverts a function that takes a row to a curried function.
curry takes a function that expects a row as its argument and returns a function that takes two arguments separately.
See the function definition in sire/sire_05_row.sire.uncurry
(uncurry f xs)
> f : (a > a)
> xs : Row a
> f (Row a)Converts a curried function to a function that takes a row.
uncurry takes a function that expects two separate arguments and returns a function that takes a row of two elements.
uncurry add [1 2] == 3
uncurry sub [5 3] == 2
uncurry v2 [1 2] == [1 2]rowCons
(rowCons e xs)
> e : a
> xs : Row a
> Row aPrepends an element to a row.
rowCons creates a new row with the given element as the first element, followed by all elements of the input row.
rowCons 1 [2 3] == [1 2 3]
rowCons b#a [] == [b#a]
rowCons 0 [1] == [0 1]rowSnoc
(rowSnoc xs e)
> xs : Row a
> e : a
> Row aAppends an element to a row.
rowSnoc creates a new row with all elements of the input row, followed by the given element as the last element.
rowSnoc [1 2] 3 == [1 2 3]
rowSnoc [] b#a == [b#a]
rowSnoc [0] 1 == [0 1]rowApply
(rowApply f xs)
> f : (a > b)
> xs : Row a
> bApplies a function to a row of arguments.
rowApply takes a function and a row of arguments, and applies the function to those arguments.
rowApply add [2 3] == 5
rowApply gte [3 4] == 0
rowApply lte [3 4] == 1rowRepel
(rowRepel f xs)
> f : (a > b)
> xs : Row a
> bApplies a function to a row of arguments in reverse order.
rowRepel takes a function and a row of arguments, and applies the function to those arguments in reverse order.
rowRepel add [2 3] == 5
rowRepel gte [3 4] == 1
rowRepel lte [3 4] == 0slash
(slash xs s e)
> xs : Row a
> s : Nat
> e : Nat
> aExtracts a slice from a row, from index s to index e, padding with zeros if necessary.
slash [1 2 3 4 5] 1 3 == [2 3]
slash [1 2 3] 0 5 == [1 2 3 0 0]
slash [1 2 3] 2 2 == []slice
(slice xs s e)
> xs : Row a
> s : Nat
> e : Nat
> aSimilar to slash, but doesn't pad with zeros. It returns a slice from index s up to (but not including) index e.
slice [1 2 3 4 5] 1 3 == [2 3]
slice [1 2 3] 0 5 == [1 2 3]
slice [1 2 3] 2 2 == []chunks
(chunks n xs)
> n : Nat
> xs : Row a
> Row aSplits a row into chunks of a specified size.
chunks 2 [1 2 3 4 5] == [[1 2] [3 4] [5]]
chunks 3 [1 2 3 4] == [[1 2 3] [4]]
chunks 5 [1 2 3] == [[1 2 3]]rep
(rep x n)
> x : a
> n : Nat
> Row aCreates a row by repeating a value a specified number of times.
rep 3 2 == [3 3]
rep b#aaab 3 == [b#aaab b#aaab b#aaab]
rep [] 2 == [[] []]rowIndexed
(rowIndexed xs)
> xs : Row a
> Row (Nat, a)Creates a row of pairs, where each pair contains the index and the corresponding element from the input row.
rowIndexed [10 20 30] == [[0 10] [1 20] [2 30]]
rowIndexed [b#aba b#bab] == [[0 b#aba] [1 b#bab]]
rowIndexed [] == []findIdx
(findIdx f xs d k)
> f : (a > Bool)
> xs : Row a
> d : b
> k : (a > b)
> aFinds the index of the first element in a row that satisfies a predicate function.
findIdx (lte 5) [1 3 5 7 9] 0 id == 2
findIdx (lte 10) [1 3 5 7 9] 0 id == 0
findIdx even [1 3 5 7] {not found} showNat == {not found}elemIdx
(elemIdx e xs d k)
> e : a
> xs : Row a
> d : a
> k : a
> aFinds the index of the first occurrence of a specific element in a row.
elemIdx 5 [1 3 5 7 5] b#{not found} id == 2
elemIdx b#a [b#b b#a b#c] b#{not found} id == 1
elemIdx 4 [1 2 3] b#{not found} id == b#{not found}has
(has e xs)
> e : a
> xs : Row a
> BoolChecks if a row contains a specific element.
has 3 [1 2 3 4 5] == 1
has b#a [b#b b#c] == 0
has [] [[1] [2] []] == 1rowAnd
(rowAnd xs)
> xs : Row Bool
> BoolPerforms a logical AND operation on all elements of a row.
rowAnd [TRUE TRUE FALSE] == 0
rowAnd [TRUE TRUE TRUE] == 1
rowAnd [] == 1rowOr
(rowOr xs)
> xs : Row Bool
> BoolPerforms a logical OR operation on all elements of a row.
rowOr [FALSE FALSE TRUE] == 1
rowOr [FALSE FALSE FALSE] == 0
rowOr [] == 0sum
(sum xs)
> xs : Row Nat
> NatCalculates the sum of all elements in a row.
sum [1 2 3 4 5] == 15
sum [10 (sub 10 3) 3] == 20
sum [] == 0sumOf
(sumOf f xs)
> f : (a > Nat)
> xs : Row a
> NatApplies a function to each element of a row and then calculates the sum of the results.
sumOf (mul 2) [1 2 3 4] == 20
sumOf (pow 2) [1 2 3] == 14
sumOf id [] == 0all
(all f xs)
> f : (a > Bool)
> xs : Row a
> BoolChecks if all elements in a row satisfy a given predicate.
all even [2 4 6 8] == 1
all (lte 0) [1 2 3] == 1
all id [] == 1any
(any f xs)
> f : (a > Bool)
> xs : Row a
> BoolChecks if any element in a row satisfies a given predicate.
any odd [2 4 5 8] == 1
any (gte 0) [1 2 3 4] == 0
any id [] == 0zip
(zip xs ys)
> xs : Row a
> ys : Row b
> Row (a, b)Combines two rows into a row of pairs.
zip [1 2 3] [b#a b#b b#c] == [[1 b#a] [2 b#b] [3 b#c]]
zip [1 2] [b#a b#b b#c] == [[1 b#a] [2 b#b]]
zip [] [1 2 3] == []zipWith
(zipWith f xs y)
> f : (a > b > c)
> xs : Row a
> y : Row b
> Row cCombines two rows using a given function.
zipWith add [1 2 3] [4 5 6] == [5 7 9]
zipWith mul [1 2 3] [1 2 3] == [1 4 9]
zipWith zip [[1 2] [1 2]] [[3 4] [3 4]] == [[[1 3] [2 4]] [[1 3] [2 4]]]cat
(cat x)
> xs : Row (Row a)
> Row aConcatenates a row of rows into a single row.
cat [[1 2 3 4] [3 4] [5]] == [1 2 3 4 5]
cat [[] [1 2] [3]] == [1 2 3]
cat [] == []catMap
(catMap f x)
> f : (a > Row b)
> xs : Row a
> Row bApplies a function to each element of a row and concatenates the results.
catMap (rep 2) [1 2 3] == [2 2 2 2 2 2]
catMap id [[1 2] [3 4]] == [1 2 3 4]take
(take n x)
> n : Nat
> xs : Row a
> Row aReturns the first n elements of a row.
take 3 [1 2 3 4 5] == [1 2 3]
take 2 [b#a b#b] == [b#a b#b]
take 5 [1 2 3] == [1 2 3]drop
(drop n xs)
> n : Nat
> xs : Row a
> Row aRemoves the first n elements from a row.
drop 2 [1 2 3 4 5] == [3 4 5]
drop 3 [b#a b#b b#c b#d] == [b#d]
drop 5 [1 2 3] == []rev
(rev xs)
> xs : Row a
> Row aReverses the order of elements in a row.
rev [1 2 3 4 5] == [5 4 3 2 1]
rev [b#a b#b b#c b#d] == [b#d b#c b#b b#a]
rev [] == []span
(span f xs)
> f : (a > Bool)
> xs : Row a
> Row (Row a)Splits a row into two parts: the longest prefix that satisfies a predicate and the rest.
span (gte 3) [1 2 3 4 1 2 3 4] == [[1 2 3] [4 1 2 3 4]]
span even [2 4 6 7 8 9] == [[2 4 6] [7 8 9]]
span FALSE [1 2 3] == [[] [1 2 3]]splitAt
(splitAt i xs)
> i : Nat
> xs : Row a
> Row (Row a)Splits a row at a given index.
splitAt 3 [1 2 3 4 5] == [[1 2 3] [4 5]]
splitAt 0 [1 2 3] == [[] [1 2 3]]
splitAt 5 [1 2 3] == [[1 2 3] []]intersperse
(intersperse e xs)
> e : a
> xs : Row a
> Row aIntersperses an element between every element of a row.
intersperse 0 [1 2 3] == [1 0 2 0 3]
intersperse b#a [b#b] == [b#b]
intersperse 0 [] == []insert
(insert i e xs)
> i : Nat
> e : a
> xs : Row a
> Row aInserts an element at a specified index in a row.
insert 1 b#x [b#a b#b b#c] == [b#a b#x b#b b#c]
insert 0 1 [1 2 3] == [1 1 2 3]
insert 3 4 [1 2 3] == [1 2 3 4]Sorting and Filtering
sort
(sort xs)
> xs : Row a
> Row aSorts a row in ascending order.
sort [3 1 4 1 5] == [1 1 3 4 5]
sort [b#c b#a b#b] == [b#a b#b b#c]
sort [] == []sortBy
(sortBy f xs)
> f : (a > Nat)
> xs : Row a
> Row aSorts a row using a custom comparison function.
sortBy (flip cmp) [1 3 2] == [3 2 1]
sortBy (cmp) [[1 2] [] [1]] == [[] [1] [1 2]]sortOn
(sortOn f xs)
> f : (a > b)
> xs : Row a
> Row bSorts a row by applying a function to each element before comparing.
sortOn (even) [1 3 2] == [3 1 2]
sortOn len [[1 2] [3] [4 5 6]] == [[3] [1 2] [4 5 6]]sortUniq
(sortUniq xs)
> xs : Row a
> Row aSorts a row and removes duplicate elements.
sortUniq [3 1 4 1 5 3] == [1 3 4 5]
sortUniq [b#a b#b b#a] == [b#a b#b]
sortUniq [] == []filter
(filter f xs)
> f : (a > Bool)
> xs : Row a
> Row aKeeps only the elements of a row that satisfy a predicate.
filter even [1 2 3 4 5] == [2 4]
filter (neq b#a) [b#a b#b b#a b#c] == [b#b b#c]
filter (const TRUE) [1 2 3] == [1 2 3]delete
(delete e xs)
> e : a
> xs : Row a
> Row aRemoves all occurrences of a value from a row.
delete 3 [1 2 3 4 3 5] == [1 2 4 5]
delete b#a [b#a b#b b#a] == [b#b]
delete 42 [1 2 3] == [1 2 3]findIdxMany
(findIdxMany f xs)
> f : (a > Bool)
> xs : Row a
> List aFinds all indices where a predicate is satisfied.
findIdxMany even [1 2 3 4 5 6] == [1 [3 [5 0]]]
findIdxMany (eql b#a) [b#a b#b b#a] == [0 [2 0]]
findIdxMany (const FALSE) [1 2 3] == 0elemIdxMany
(elemIdxMany e xs)
> e : a
> xs : Row a
> Either (List a) NatFinds all indices where a specific element occurs.
elemIdxMany 3 [1 2 3 4 3 5] == [2 [4 0]]
elemIdxMany b#a [b#a b#b b#a] == [0 [2 0]]
elemIdxMany 42 [1 2 3] == 0Last updated