Вы можете сделать это для любого типа F #, который вы хотите определить.Вы не получаете автоматические строчные версии своих имен ... но тогда, также, как и встроенные типы F #: в FSharp.Core/prim-types.fs
в исходном коде F # есть определение type 'a list = List<'a>
, поэтому вы можете написать int list
, а не List<int>
.
И вы также можете использовать Foo<'a>
или 'a Foo
(или 'a foo
), когда вы также определяете свой тип.Единственное правило заключается в том, что вы должны соответствовать стилю оболочки, который вы использовали при определении типа.Вот интерактивный сеанс F # для демонстрации:
> type Foo<'a> = 'a list ;;
type Foo<'a> = 'a list
> type 'a bar = 'a list ;;
type 'a bar = 'a list
> let x : int Foo = [] ;;
val x : Foo<int> = []
> let y : Foo<int> = [] ;;
val y : Foo<int> = []
> let z : int bar = [] ;;
val z : int bar = []
> let w : bar<int> = [] ;;
val w : int bar = []
Но вы должны соответствовать регистру того типа, который вы определили:
> let x : int foo = [] ;;
let x : int foo = [] ;;
------------^^^
error FS0039: The type 'foo' is not defined. Maybe you want one of the following:
Foo
Foo`1
> let y : Bar<int> = [] ;;
let y : Bar<int> = [] ;;
--------^^^
error FS0039: The type 'Bar' is not defined. Maybe you want one of the following:
bar
bar`1
Обратите внимание, что мы получили Foo<int>
как тип, указанный вF # Интерактивные ответы, независимо от того, определили ли мы наш тип как int Foo
или Foo<int>
.Это не основывается на регистре (верхнем или нижнем), который мы использовали для определения типа, а скорее на порядке префикса / постфикса, который мы использовали:
> type foo<'a> = 'a list ;;
type foo<'a> = 'a list
> type 'a bar = 'a list ;;
type 'a bar = 'a list
> let x : 'a foo = [] ;;
val x : foo<'a>
> let y : 'a bar = [] ;;
val y : 'a bar
Итак, поехали.Вы можете использовать этот синтаксис для своих собственных типов, не делая ничего особенного.Единственное правило заключается в том, что тип должен принимать в точности один универсальный параметр: вы не можете сделать type d = int,string Dictionary
.Для типов, которые принимают два или более общих параметров, вы должны определить их в стиле Dictionary<int,string>
.