使用模块Set Ocaml

时间:2010-11-25 10:42:41

标签: set ocaml

我正在创建一个使用语法的程序,看看这个语法是否是LL(1)。我想使用模块Set,但我不知道如何继续,当然,set的元素类型将为char,你能帮忙吗?

1 个答案:

答案 0 :(得分:3)

这个答案假定您已经知道如何确定语法是否为LL(1),并且只是在寻找有关Objective Caml Set模块的特定用法的帮助。

标准库Set提供了一个仿函数,可让您构建自己的set模块,以满足您的特定需求。您需要提供一个模块来描述集合中的元素类型,以及一个遵循与compare相同约定的比较函数:compare a b = 0 if a = bcompare a b < 0 if 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 */ *)