Ocaml - 生成所有char值的列表

Jam*_*ham 7 ocaml

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

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

谢谢!

Pat*_*atJ 8

使用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)

  • @JamesAllingham我会做`Array.to_list(Array.init 256 Char.chr)`.这也适用于旧版本的OCaml. (2认同)

Dru*_*rup 5

如果使用扩展标准库不会吓到你,使用容器:

CCList.(map Char.chr @@ range 0 255)
Run Code Online (Sandbox Code Playgroud)

您也可以使用电池,底座和其他设备.

  • @Mars`f @@ expr`与`f(expr)`相同,所以你可以用parens重写它作为`map Char.chr(范围0 255)`. (2认同)