Внедрение модулей Ocaml - PullRequest
       4

Внедрение модулей Ocaml

9 голосов
/ 21 октября 2010

Стандартная библиотека Ocaml содержит различные модули: List, Map, Nativeint и т. Д. Я знаю, что предусмотрены интерфейсы для этих модулей (например, для Список модулей ), но яинтересует алгоритмы и их реализации, используемые в функциях модулей.

Где я могу найти это?

Ответы [ 3 ]

19 голосов
/ 21 октября 2010
<ч />

Реализация List интересна для изучения. Например, функция map может быть реализована так:

let rec map f = function
  | [] -> []
  | a::l -> f a :: map f l

но вместо этого реализован так:

let rec map f = function
  | [] -> []
  | a::l -> let r = f a in r :: map f l

Какая разница? Выполните это:

List.map print_int [1;2;3] ;;
map print_int [1;2;3] ;;

Первый печатает 123, а второй печатает 321! Поскольку оценка f a может привести к побочным эффектам, важно установить правильный порядок. Это то, что делает официальная реализация карты. Действительно, порядок вычисления аргументов не определен в OCaml , даже если все реализации следуют одному и тому же порядку.

См. Также статью Оптимизация List.map в блоге Jane Street , чтобы узнать о производительности (List.map эффективен в небольших списках).

5 голосов
/ 21 октября 2010

Вы можете найти определения в исходном коде OCaml. Например, реализация функций Map находится в stdlib/map.ml в исходном дистрибутиве OCaml.

4 голосов
/ 21 октября 2010

Они уже должны быть установлены в вашей системе. Скорее всего (с учетом системы Unix) они находятся в / usr / lib / ocaml или / usr / local / lib / ocaml. Просто откройте любой из файлов .ml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...