Ocaml l oop для струнной печати - PullRequest
0 голосов
/ 26 апреля 2020
let string s = "";;

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

image

Я хочу напечатать f с типом строки в l oop (ex-string "hi" -> "hihihihihi") Когда я использую для, Это делает строку в единицу и это не работает. Как l oop печатать строковым типом?

Example image

Ответы [ 3 ]

0 голосов
/ 26 апреля 2020

Примерно так:

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)
0 голосов
/ 26 апреля 2020

Есть несколько способов сделать это с буфером или форматом с правильной сложностью.

Во-первых, более императивная версия, вероятно, с буфером

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 под капотом, поэтому сложность та же, что и раньше. Если мы сделаем буфер явным, у нас может быть императивный код, использующий принтер формата

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

, который может быть полезен, если мы добавляем в буфер что-то более сложное, чем строка.

0 голосов
/ 26 апреля 2020

Это то, что вы пытаетесь совершить sh?

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

let () = string_n_times "Hi" 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...