字符串 printf 的 Ocaml 循环

Ocaml loop for string printf

let string s = "";;

let string s =
    for i = 0 to 5 do
    Printf.sprintf "%s" s
    done;;

我想在循环中使用字符串类型打印 (ex-string "hi" -> "hihihihihi") 当我使用 for 时,它使字符串成为单位并且它不起作用。 如何循环打印字符串类型?

这是您想要完成的吗?

let string_n_times s n =
  for i = 0 to n do
    Printf.printf "%s" s
  done

let () = string_n_times "Hi" 5

像这样:

let string_n_times s n =
  let str = ref "" in
  for i = 1 to n do
    str := !str ^ s
  done; !str

let () = print_endline (string_n_times "hi" 5)

有几种方法可以使用缓冲区或格式来做到这一点,并且具有适当的复杂性。

首先,更命令式的版本可能带有缓冲区

let string_repeat_n_time s n =
   let b = Buffer.create (String.length s * n) in
   for i = 1 to n do
     Buffer.add_string b s
   done;
   Buffer.contents b

缓冲区可以有效地处理重复添加,因此它们是正确的数据结构。

一个更实用的版本是使用 Format.fprintf 的递归(Format 本质上是 Printf 的改进版本)

let string_n_times s n =
  let rec repeat ppf n = 
    if n = 0 then Format.fprintf ppf "%!"
    else
      Format.fprintf ppf "%s%a" s repeat (n-1) in
  Format.asprintf "%a" repeat n ;;

此代码在后台使用 Buffer,因此复杂性与以前相同。如果我们显式设置缓冲区,我们可以有一个使用格式 printer

的命令式代码
let string_n_times s n =
   let b = Buffer.create (String.length s * n) in
   let ppf = Format.formatter_of_buffer b in  
   for i = 1 to n do
      Format.fprintf ppf "%s" s
   done;
   Format.fprintf ppf "%!" (* flush *);
   Buffer.contents b

如果我们向缓冲区添加比字符串更复杂的内容,这会很有用。