字符串 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
如果我们向缓冲区添加比字符串更复杂的内容,这会很有用。
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
如果我们向缓冲区添加比字符串更复杂的内容,这会很有用。