# List-Like Expressions in F# 2.0

F# provides literal expressions for tuples, F# lists, arrays, sequences (enumerables) and other generic types. The elements of a tuple expression are separated by **commas**. The elements of all other kinds of list-like expressions are separated by **semicolons**.

F# Expression | F# Type Representation | C# Type Representation |
---|---|---|

17, 3, 8 | int * int * int | Tuple<int, int, int> |

[17; 3; 8] | int list | FSharpList<int> |

[|17; 3; 8|] | int[] | int[] |

seq {yield 17; yield 3; yield 8} | int seq | IEnumerable<int> |

Note that F# lists should not be exposed to non-F# clients, because they do not have the corresponding syntactic constructs (e.g. `::`

operator, pattern matching, etc.).

The expressions can be **nested** deliberately:

F# Nested Expression | F# Type Representation | C# Type Representation |
---|---|---|

[17, 3, 8] | (int * int * int) list | FSharpList<Tuple<int, int, int>> |

[|17, 3, 8|] | (int * int * int)[] | Tuple<int, int, int>[] |

[|[|17; 3; 8|]; [|5; 2|]|] | int[][] | int[][] |

array2D [[1; 5]; [7;9]] | int[,] | int[,] |

[|array2D [[1; 3]; [1; 3]]|] | int[,][] | int[][,] |

[|2.7M, true; 3.9M, false|] | (decimal * bool)[] | Tuple<decimal, bool>[] |

(1, 'c'), (3.3, 20I, "abc") | (int * char) * (float * bigint * string) | Tuple<Tuple<int, char>, Tuple<double, BigInteger, string>> |

Note that in F#, jagged multidimensional arrays are represented in reverse order compared to C#: The F# type `int[,][]`

corresponds to the C# type `int[][,]`

. This is to stay consistent with other F# postfix type names, such as `int option list`

, which represents instances like `[None; Some(1); Some(2)]`

.

When each element is put on its own line, the semicolons can be ignored, as in this array of type `int[]`

:

```
[| 17
3
8 |]
```

F# features many more kinds of expressions to simplify working with list-like types. The following range expression defines an `IEnumerable<decimal>`

from 3 to 1275, with steps of 0.25 in between: 3, 3.25, 3.50, 3.75...:

`seq { 3M .. 0.25M .. 1275M }`

The following code defines an array of type `int[]`

with squares of positive whole numbers: 1, 4, 9, 16, ...

`[| for i in 1 .. 1000 -> i * i |]`

All list-like types in F# are supported by a wealth of keywords, symbols and operators and helper functions in FSharp.Core.dll. The following code defines an "infinite" `IEnumerable<UInt64>`

of binomial results, calculated from each consecutive pair of natural numbers starting at zero: 1, 9, 25, 49, ...:

```
Seq.initInfinite uint64
|> Seq.pairwise
|> Seq.map(fun (a, b) -> pown (a + b) 2)
```

Further information on list-like expressions in F# can be found in the F# 2.0 language specification and F# language reference.