Я привык к библиотеке Core
JaneStreet. Его List
модуль имеет аккуратный init
функцию:Ядро «List.init» в Pervasives?
List.init;;
- : int -> f:(int -> 'a) -> 'a list = <fun>
Это позволяет создать список с помощью пользовательской функции для инициализации элементов:
List.init 5 ~f:(Fn.id);;
- : int list = [0; 1; 2; 3; 4]
List.init 5 ~f:(Int.to_string);;
- : string list = ["0"; "1"; "2"; "3"; "4"]
Однако эта функция, кажется, не существует в Pervasives
, что печально. Я что-то упускаю, или я должен сам его реализовать? И если мне нужно это написать, как мне это достичь?
EDIT:
Я написал императивную версию init
, но он не чувствует себя вправе прибегнуть к императивным особенностям OCaml в таком случае. :(
let init n ~f =
let i = ref 0 in
let l = ref [] in
while !i < n do
l := (f !i) :: !l;
incr i;
done;
List.rev !l
;;
EDIT 2:
Я открыл pull request на GitHub OCaml, чтобы иметь эту функцию включены
как общий комментарий: не ожидайте какого-либо удобства от Pervasives. если вам нужна полная стандартная библиотека, в настоящее время вам придется использовать либо Core, либо Containers или Batteries (могут быть другие). – user3240588
Да, я уже это заметил. – RichouHunter