F # постфиксные ключевые слова для типа - PullRequest
3 голосов
/ 20 сентября 2019

Насколько мне известно, в F # есть специальная запись для типа Option и List.Например, Option<'a> это то же самое, что и написание 'a option, и поэтому оно относится к 'a list и FSharpList<'a>.

. Это ключевые слова для конкретного языка или существует способ определения пользовательских типов, которыеможет использовать нотацию «post-fix» таким же образом list и option do?

1 Ответ

5 голосов
/ 20 сентября 2019

Вы можете сделать это для любого типа 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>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...