Difference between revisions of "List notation"
Jump to navigation
Jump to search
(there are cool things possible with bare list syntax) |
(insert elements conditionally) |
||
Line 23: | Line 23: | ||
listB ++ |
listB ++ |
||
[] |
[] |
||
+ | </haskell> |
||
+ | * You can insert elements or sub-lists conditionally. |
||
+ | <haskell> |
||
+ | 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) ?++ |
||
+ | [] |
||
</haskell> |
</haskell> |
||
* You can construct a singleton list with a [[operator section|section]] of the colon operator: <haskell>(:[]) :: a -> [a]</haskell>. |
* You can construct a singleton list with a [[operator section|section]] of the colon operator: <haskell>(:[]) :: a -> [a]</haskell>. |
Revision as of 09:25, 19 May 2007
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: . E.g.
(x:) :: [a] -> [a]
creates a list of blank strings with increasing size very efficiently.iterate (' ':) []
See also: