Я создаю программу, которая использует грамматику и видит, является ли эта грамматика LL (1). Я хочу использовать модуль Set, но я понятия не имею, как действовать, конечно, тип элементов набора будет char, вы можете помочь?Использовать модуль Set Ocaml
ответ
Этот ответ предполагает, что вы уже знаете, как определить, является ли грамматика 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
выше имеет interface described in the documentation. Суть ее в том, что наборы неизменные ценности (как списки), поэтому модуль предоставляет вам функции, которые создают новый набор из существующего набора путем добавления или удаления элементов:
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 */ *)
Я не знаю. Возможно нет. Требует ли ваш алгоритм хранения грамматик в наборе? – 2010-11-26 08:00:52