2015-03-16 2 views
0

определение При чтении исходного кода F #, я нашел definition из List<'T> типа, который выглядит следующим образом:Разъяснение Список <'T> синтаксиса

type List<'T> = 
     | ([]) :     'T list 
     | (::) : Head: 'T * Tail: 'T list -> 'T list 

Может кто-нибудь, пожалуйста, объясните выше синтаксис? Компилятор предупреждает, что «эта конструкция устарела: она предназначена только для использования в библиотеке F #». Является ли синтаксис только старым способом определения дискриминационных союзов? Если да, то почему Tail имеет тип 'T list -> 'T list вместо 'T list?

ответ

2

Я считаю, что это означает следующее:

type List<'T> = 
     | ([]) :     'T list 
     | (::) : (Head: 'T * Tail: 'T list) -> 'T list 

То есть, (::) это функция, которая, учитывая упорядоченная пара 'T * 'T list генерирует 'T list.

Устаревшая конструкция предоставляет аннотации типов к разграниченным конструкторам объединения. Насколько мне известно, вам никогда не приходилось это делать в любой версии F #. Я не знаю, почему они должны были сделать это в библиотеке F #.

+0

Would что также эквивалентно «типа MyList <'T> = | ([]) из 'списка T | (: :) головки:' T * Tail:«список T» ? –

+0

Да, это во всех отношениях. Просто в принципе, (: :) - это функция. – GregRos

+0

ОК, спасибо. Я сделал тестовый тип следующим образом: «type Test = | Case1: int -> Test | Case2: string -> Test". Хотя предупреждение об устаревании все еще существует, тип работает так, как ожидалось. 'let test1 = Case1 (5)', 'let test2 = Case2 ("test")'. Я думаю, вы правы - предупреждение означает, что мы должны использовать «Case1 of int» вместо «Case1: int -> Test». Еще раз спасибо. –

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