我一直试图找到一种简单的方法来获取OCaml中所有可能的char值列表(即['\ _'';'\ 001'; ...;'\ 255'])。
在Python中,我会做一个简单的列表理解,如:
[chr(x) for x in range(255)]
然而,我目前在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
有人能指出我最简单的方法吗?
谢谢!
答案 0 :(得分:8)
使用OCaml 4.06,使用List.init
,您可以非常轻松地完成这项工作:
let l = List.init 256 Char.chr
在旧版本的OCaml上,您需要更多代码:
let l =
let rec aux i acc =
if i < 0 then acc else aux (i-1) (Char.chr i::acc)
in aux 255 []
更新:来自Martin Jambon的评论:
let l = Array.to_list (Array.init 256 Char.chr)
答案 1 :(得分:5)
答案 2 :(得分:0)
纯vanila OCaml的简短版本。不是尾递归,而是演示OCaml的功能性:
let rec range n = if n < 0 then [] else n :: range (n - 1)
let chars = List.rev_map Char.chr (range 255)