我一直试图找到一种简单的方法来获取OCaml中所有可能的char值列表(即['\ _00';'\ 001'; ...;'\ 255']).
在Python中,我会做一个简单的列表理解,如:
[chr(x) for x in range(255)]
Run Code Online (Sandbox Code Playgroud)
但是,我目前在OCaml中所知道的方式要简单得多:
all_chrs = let rec up_to = fun lst max ->
match lst with
| [] -> failwith "Invalid_input"
| hd::tl ->
let up = hd + 1 in
if up = max then up::lst
else up_to (up::lst) max
in let all_ascii = up_to [0] 255
in List.map Char.chr all_ascii
Run Code Online (Sandbox Code Playgroud)
有人能指出我最简单的方法吗?
谢谢!
使用OCaml 4.06,List.init您可以非常轻松地完成:
let l = List.init 256 Char.chr
Run Code Online (Sandbox Code Playgroud)
在旧版本的OCaml上,您需要更多代码:
let l =
let rec aux i acc =
if i < 0 then acc else aux (i-1) (Char.chr i::acc)
in aux 255 []
Run Code Online (Sandbox Code Playgroud)
更新:来自Martin Jambon的评论:
let l = Array.to_list (Array.init 256 Char.chr)
Run Code Online (Sandbox Code Playgroud)
如果使用扩展标准库不会吓到你,使用容器:
CCList.(map Char.chr @@ range 0 255)
Run Code Online (Sandbox Code Playgroud)
您也可以使用电池,底座和其他设备.