Ocaml - 生成所有char值的列表

时间:2018-04-21 14:37:50

标签: ocaml

我一直试图找到一种简单的方法来获取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

有人能指出我最简单的方法吗?

谢谢!

3 个答案:

答案 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)

如果使用扩展标准库不会吓到你,请使用containers

CCList.(map Char.chr @@ range 0 255)

你也可以用电池,电池等来做同样的事情。

答案 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)