List notation
We are used to the list notation [0,1,2,3].
However it is syntactic sugar for (0:1:2:3:[]).
By using the syntactic sugar,
we often miss the benefits of the direct notation.
- A trailing colon is like a terminator.
0 : 1 : 2 : 3 : []
- Thus it is more theoretically sound and easier to edit.
- You can easily mix elements and lists into a list by appending the corresponding operator in each line:
[1,2,3] ++ 4 : listA ++ 5 : listB ++ []
- You can insert elements or sub-lists conditionally.
infixr 5 ?:, ?++ (?:) :: (Bool, a) -> [a] -> [a] (?:) (b, x) = if b then (x:) else id (?++) :: (Bool, [a]) -> [a] -> [a] (?++) (b, x) = if b then (x++) else id list = [2,3] ++ (x==5, 5) ?: (x==7, listA) ?++ []
- You can construct a singleton list with a section of the colon operator:
(:[]) :: a -> [a]
. - You can prepend an element to a list:
(x:) :: [a] -> [a]
. E.g.iterate (' ':) []
creates a list of blank strings with increasing size very efficiently.
See also:
