Типы вариантов Ocaml - PullRequest
       7

Типы вариантов Ocaml

4 голосов
/ 24 января 2011

Типы OCaml всегда смущали меня независимо от того, какие учебники / руководства я читаю Мне нужно определить тип, скажем, тест, который содержит следующие формы:

тест типа ('a,' b), который имеет одну из форм: Пусто, T t, N n, Seq [x1 ... xn]

Я знаю, как сделать первые 3, но я абсолютно не знаю, как определить последнюю форму. Вот что у меня есть:

type ('nonterm, 'term) test =
   | Empty
   | T of 'term
   | N of 'nonterm
   | ????

Для seq мне нужно сопоставить экземпляры подвыражений от x1 до xn. Если x = 0, то это пусто. Кто-нибудь может мне помочь? Заранее спасибо.

Ответы [ 2 ]

11 голосов
/ 24 января 2011

Подвыражения Seq также являются тестами? Если это так, вы можете использовать список:

type ('nonterm, 'term) test =
  | Empty
  | T of 'term
  | N of 'nonterm
  | Seq of ('nonterm, 'term) test list

Списки, конечно, могут быть пустыми.

7 голосов
/ 24 января 2011

Это ответ на ваш комментарий Майклу E:

Варианты OCaml состоят из конструкторов с необязательными аргументами.В случае ответа Майкла, конструкторы: Empty, T, N и Seq.Empty не принимает аргументов, T принимает универсальный тип с именем 'term, а N принимает универсальный тип с именем 'nonterm (через секунду я доберусь до Seq).Вариант имеет тип ('nonterm, 'term) test.Допустим, вам нужен список элементов типа ('nonterm, 'term) test:

# [Empty; Empty];;
- : ('a, 'b) test list = [Empty; Empty] 

Вы заметите, что типом является ('a, 'b) test list.(OCaml заменил nonterm на a и term на b, но вам не нужно об этом слишком беспокоиться).

Теперь мы видим, что | Seq of ('nonterm, 'term) test list является конструкторомс именем Seq, который принимает список элементов типа ('nonterm, 'term) test в качестве аргумента.Теперь мы можем сделать это:

# Seq [Empty;Empty];;
- : ('a, 'b) test = Seq [Empty; Empty]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...