Используйте модуль Set Ocaml - PullRequest
2 голосов
/ 25 ноября 2010

Я создаю программу, которая использует грамматику и проверю, является ли эта грамматика LL (1). Я хочу использовать модуль Set, но не знаю, как поступить, конечно, тип элементов набора будет обугливаться, вы можете помочь?

1 Ответ

3 голосов
/ 25 ноября 2010

В этом ответе предполагается, что вы уже знаете, как определить, соответствует ли грамматика LL (1), и просто ищете справку по конкретному использованию модуля Objective Caml Set.

Стандартная библиотека Set предоставляет функтор, который позволяет вам создавать свой собственный набор модулей, адаптированный к вашим конкретным потребностям.Вам необходимо предоставить модуль, который описывает тип элементов внутри набора, и функцию сравнения, которая следует тому же соглашению, что и compare: compare a b = 0, если a = b, compare a b < 0, если a < b и так далее.Для символов это может быть:

module OrderedChar = struct
  type t = char
  let compare = compare
end

module CharSet = Set.Make(OrderedChar)

Модуль CharSet выше имеет интерфейс , описанный в документации .Суть в том, что наборы являются неизменяемыми значениями (например, списками), поэтому модуль предоставляет вам функции, которые создают новый набор из существующего набора путем добавления или удаления элементов:

let a  = CharSet.add    'a' CharSet.empty 
let ab = CharSet.add    'b' a
let b  = CharSet.remove 'a' ab
(* /* a, b and ab are three sets containing respectively {a}, {b} and {ab} */ *)

Доступ к элементамнабор происходит в основном через запросы существования и итерацией:

assert (CharSet.mem 'a' ab) 
assert (not (CharSet.mem 'c' b))

CharSet.iter print_char ab 
(* /* Prints 'ab' : follows the order defined by your 'compare' function */ *)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...