Легкий и хороший способ проверить адреса электронной почты в Java состоит в том, чтобы использовать EmailValidator библиотеки Apache Commons Validator .
я всегда проверял бы адрес электронной почты во входную форму против чего-то вроде этого прежде, чем послать электронное письмо - даже если Вы только находите некоторые опечатки. Вы, вероятно, не хотите писать, что автоматизированный сканер для "доставки привел к сбою" письма уведомления.:-)
Наборы определяются с использованием функционального интерфейса. Для любого данного типа вы должны создать модуль 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.) В дополнение к ответу Криса может быть полезно сказать, что некоторые стандартные библиотечные модули уже придерживаются сигнатуры 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 *)