2014-10-25 6 views
2

Я работаю на '99 проблем F #», и увидел следующее определение NestedList:F Синтаксис определения # Тип

type 'a NestedList = List of 'a NestedList list | Elem of 'a 

Я немного запутался синтаксисом здесь, как правило, есть только имя типа после type. Может кто-нибудь уточнить это? Благодаря!

+0

Что это за 99 проблем? – vtortola

+1

@vtortola http://www.fssnip.net/an довольно хорошо разработанные проблемы – zhengbli

+0

Ницца, я сам изучаю fsharp, хороший ресурс! – vtortola

ответ

4

Это discriminated union в сжатом синтаксисе. Вы также можете написать:

type 'a NestedList = 
    | List of 'a NestedList list 
    | Elem of 'a 

или

type NestedList<'a> = 
    | List of NestedList<'a> list 
    | Elem of 'a 

Это использование дженериков, где сам тип принимает другой тип в качестве аргумента.

+3

Еще один способ написать первый случай: 'Список списка >'. – svick

+1

Или 'Список списка <'a NestedList>', если вам нравится смешивать вещи. Не делайте этого; нотация пространства обычно используется только для встроенных типов, которые поступают из OCaml, таких как «список» и «опция». '' массив', хотя мы склонны предпочитать C# -style ''a []'. – Tarmil

2

Таким образом, это определение общего дискриминационного объединения с общим типом 'a.

Основная идея состоит в том, что каждый элемент имеет тип 'a.

3

F # имеет два способа задания общего типа:.

  • C#/NET стиль - SomeType<'a, 'b>
  • OCaml/ML стиль - ('a * 'b) SomeType

Это действительно два способа заявив, то же самое и может использоваться взаимозаменяемо. Какой из них использовать, это вопрос предпочтений и стандартов кода. Обычно люди используют стиль OCaml для базовых типов F #, таких как список, массив или параметр, и стиль C# для пользовательских и BCL-единиц.

Смежные вопросы