OCaml: модули Набора

Легкий и хороший способ проверить адреса электронной почты в Java состоит в том, чтобы использовать EmailValidator библиотеки Apache Commons Validator .

я всегда проверял бы адрес электронной почты во входную форму против чего-то вроде этого прежде, чем послать электронное письмо - даже если Вы только находите некоторые опечатки. Вы, вероятно, не хотите писать, что автоматизированный сканер для "доставки привел к сбою" письма уведомления.:-)

18
задан Nick Heiner 20 September 2009 в 22:43
поделиться

2 ответа

Наборы определяются с использованием функционального интерфейса. Для любого данного типа вы должны создать модуль Set для этого типа с помощью функтора Set.Make . К сожалению, стандартные библиотеки упускают из виду то, что они не определяют экземпляры Set для встроенных типов. В большинстве простых случаев достаточно использовать Pervasives.compare . Вот определение, которое работает для int :

module IntSet = Set.Make( 
  struct
    let compare = Pervasives.compare
    type t = int
  end )

Модуль IntSet реализует интерфейс Set.S . Теперь вы можете работать с наборами, используя модуль IntSet :

let s = IntSet.empty ;;
let t = IntSet.add 1 s ;;
let u = IntSet.add 2 s ;;
let tu = IntSet.union t u ;;

Обратите внимание, что вам не нужно явно определять структуру ввода для Set.Make как OrderedType ; вывод типа сделает всю работу за вас. В качестве альтернативы, вы можете использовать следующее определение:

module IntOrder : Set.OrderedType = struct
  type t = int
  let compare = Pervasives.compare
end

module IntSet = Set.Make( IntOrder )

Это имеет то преимущество, что вы можете повторно использовать тот же модуль для создания экземпляра Map :

module IntMap = Map.Make( IntOrder )

Вы теряете некоторую универсальность при использовании функторов, поскольку тип элементы зафиксированы. Например, вы не сможете определить функцию, которая принимает Set некоторого произвольного типа и выполняет с ним некоторую операцию. (К счастью, сам модуль Set декларирует множество полезных операций над Set s.)

• уметь определять функцию, которая принимает Set некоторого произвольного типа и выполняет над ним некоторые операции. (К счастью, сам модуль Set декларирует множество полезных операций над Set s.)

• уметь определять функцию, которая принимает Set некоторого произвольного типа и выполняет над ним некоторые операции. (К счастью, сам модуль Set декларирует множество полезных операций над Set s.)

30
ответ дан 30 November 2019 в 06:59
поделиться

В дополнение к ответу Криса может быть полезно сказать, что некоторые стандартные библиотечные модули уже придерживаются сигнатуры OrderedType . Например, вы можете просто:

module StringSet = Set.Make(String) ;;       (* sets of strings *)
module Int64Set = Set.Make(Int64) ;;         (* sets of int64s *)
module StringSetSet = Set.Make(StringSet) ;; (* sets of sets of strings *)

И т. Д.

Вот простой пример использования StringSet ; помните, что наборы являются функциональными структурами данных, поэтому добавление нового элемента в набор возвращает новый набор:

let set = List.fold_right StringSet.add ["foo";"bar";"baz"] StringSet.empty ;;
StringSet.mem "bar" set ;; (* returns true *)
StringSet.mem "zzz" set ;; (* returns false *)
12
ответ дан 30 November 2019 в 06:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: