Могу ли я использовать специальный общий синтаксис для своих собственных типов? - PullRequest
0 голосов
/ 17 января 2019

В F # некоторые типы имеют специальный общий синтаксис (я не уверен, как он называется), так что вы можете сделать:

int list // instead of List<int>
int option // instead of Option<int>
  • Как называется этот синтаксис?
  • Могу ли я включить его для своих типов?

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Во-первых, важно отметить, что разница между 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 #.

0 голосов
/ 17 января 2019

Это покрыто MSDN на типах F #

Под "универсальным типом":

универсальный тип

тип-параметра generic-type-name | 'a list

Или

generic-type-name <тип-список параметров> | list<'a>

И «построенные типы»:

составной тип (универсальный тип, для которого задан аргумент определенного типа)

тип-аргумент generic-type-name

или

* * Родовое имя-тип 1027 <тип-аргумент-список>
type dave<'a> = {
    V : 'a
};;

let stringDave: dave<string> = { V = "string" };;
//val stringDave : dave<string> = {V = "string";}

let intDave : int dave = { V = 123 };;
//val intDave : dave<int> = {V = 123;}

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