我已经习惯了JaneStreet的Core
库。它的List
模块有一个整洁init
功能:核心的普遍使用的`List.init`?
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
,这很伤心。我错过了什么,还是我必须自己实现?如果我确实需要写它,我该如何实现呢?
编辑:
我写的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
;;
编辑2:
我已经开了一个pull request上OCaml中的GitHub上有此功能包括
作为一般评论:不要指望普及的任何方便。如果你想要一个完整的标准库,你将不得不使用核心或容器或电池(可能还有其他)。 – user3240588
是的,我已经注意到了。 – RichouHunter