Base
Base — одна из самых популярных альтернатив стандартной библиотеке OCaml'а. Она добавляет значительный функционал, исправляет проблемные места в дизайне, а также добавляет больше полиморфных возможностей.
Ее использование в составе Core полностью раскрывается в книге RWO.
Смотрите также
Дизайн
Целью Base является быть портативной заменой оригинальной стандартной библиотеки, из-за чего в ней недоступны некоторые I/O функции. Но при необходимости их можно вызвать через модуль Stdlib
.
Явный контроль ошибок
Использование монад Option.t
и Result.t
является предпочтительным, поэтому все функции Base в случае ошибки возвращают один из этих типов.
Но чтобы не быть совсем чопорным, в Base существуют функции-двойники, что возвращают эксепшен. Их можно отличить по характерному суффиксу _exn
в название функции.
Например:
utop # List.hd [];;
(* - : 'a option/2 = None *)
utop # List.hd_exn [];;
(* Exception: Failure "hd". *)
Backtrace recording
В Base по-умолчанию включён backtrace recording, в отличие от стандартной библиотек. Почему это так можно прочитать тут.
Полиморфное сравнение
Оригинальные операторы сравнения (=
, >
, ...) являются операторами структурного сравнения представления данных в во время исполнения, что не совсем то, что вы хотели бы.
Поэтому в Base операторы сравнения (глобально) работают только с int
. Чтобы сравнивать другие типы вы должны явно использовать соответствующую функцию модуля или оператор.
Пример:
utop # String.equal "привет" "privet";;
utop # String.("привет" = "privet");;
В случае если необходим прям настоящий полиморфизм, то для этого есть модуль Comparable
.
let max (type t) (module C : Comparable.S with type t = t) =
List.reduce ~f:(fun max_val x -> if C.(max_val < x) then x else max_val)
Синтаксические расширения
Благодаря ppx_jane
можно автогенерировать функции для наших модулей.
Как пример:
utop # module M = struct
type t = { id : int; aliases : Set.M(String).t }
[@@deriving sexp, compare, hash]
end
module M :
sig
type t = { id : int; aliases : Base.Set.M(Base.String).t; }
val t_of_sexp : Sexp.t -> t
val sexp_of_t : t -> Sexp.t
val compare : t -> t -> int
val hash_fold_t :
Base_internalhash_types.state -> t -> Base_internalhash_types.state
val hash : t -> int
end
Пакет ppx_jane
является эдаким мета-пакетом, в котором просто перечислены зависимости. Смотрите зависимости, чтобы узнать о всех возможностях.