SML: объявление типа данных не разрешает [] - PullRequest
0 голосов
/ 26 декабря 2018

Стандартная база SML list определяется как

datatype 'a list = [] | :: of 'a * 'a list

Однако, я получаю эту ошибку, когда пытаюсь создать свой собственный тип данных списка:

- datatype 'a mylist = [] | mycons of 'a * 'a mylist
 Error: syntax error found at LBRACKET

Однако,это работает:

- datatype 'a mylist = Nil | mycons of 'a * 'a mylist;
datatype 'a mylist = Mycons of 'a * 'a mylist | Nil

Но из-за отсутствия квадратных скобок этот версон не выдает очень похожий на список вывод:

- Mycons (1,Nil);
val it = Mycons (1,Nil) : int mylist
- Mycons (1, Mycons (1,Nil));
val it = Mycons (1,Mycons (1,Nil)) : int mylist

Почему SML не принимает мой оригиналпопытка с []?

1 Ответ

0 голосов
/ 26 декабря 2018

Это:

Стандартный список баз SML определен как

datatype 'a list = [] | :: of 'a * 'a list

неверно.

Скорее, list - этоопределяется следующим образом:

datatype 'a list = nil | :: of 'a * 'a list

, а запись [foo, bar, baz] - это специальный синтаксис («производная форма»), который явно определяется в определении 1011 * стандарта ML, пересмотренном (в Приложении A, на стр. 56) как эквивалент foo :: bar :: baz :: nil.


Для вашего типа вы не сможете переопределить синтаксис [...] - он встроен в язык, иего значение фиксировано - но вы можете сделать свой синтаксис по меньшей мере несколько более дружественным, используя символический (не алфавитно-цифровой) идентификатор и объявив его как инфиксный и ассоциативный справа;например:

infixr :::

datatype 'a my_list = MY_NIL | ::: of 'a * 'a my_list

val twoOnes = 1 ::: 1 ::: MY_NIL
...