Во-первых, важно отметить, что разница между list
и List
напрямую не связана с синтаксисом префикса и постфикса. Тип 'T list
- это просто псевдоним типа List<'T>
. Исходный код ядра F # :
type List<'T> =
| ([]) : 'T list
| (::) : Head: 'T * Tail: 'T list -> 'T list
interface System.Collections.Generic.IEnumerable<'T>
interface System.Collections.IEnumerable
interface System.Collections.Generic.IReadOnlyCollection<'T>
interface System.Collections.Generic.IReadOnlyList<'T>
and 'T list = List<'T>
И помимо этого у нас есть возможность выражать любые префиксы или постфиксы универсальных типов.
Сочетание этих двух вещей означает, что все эти типы действительны и эквивалентны.
int list
int List
list<int>
List<int>
Это работает с любыми другими типами .NET, например, int System.Collections.Generic.HashSet
, и ваши собственные типы:
type MyCoolType<'a> = A | B
let x : int MyCoolType = A
// compiles ✔
По-видимому, существуют и строчные аннотации типа, и синтаксис постфикса для совместимости с OCaml, языком, на котором изначально был основан F #.