<ч />
Реализация 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
эффективен в небольших списках).