Как добавить символ в строку в OCaml? - PullRequest
9 голосов
/ 30 ноября 2011

Кажется, что в стандартной библиотеке типа char -> string -> string нет функции, которая вставляет char перед (или в конце) string. Есть обходные пути, например, используя String.make или String.blit. Есть ли элегантный способ сделать это?

Ответы [ 3 ]

18 голосов
/ 30 ноября 2011

Код из @pad - это то, что я бы использовал, потому что мне нравится обрабатывать строки как неизменяемые, если это возможно. Но я бы не стал использовать Char.escaped; он специализирован для лексического представления символов в OCaml. Итак, вот что вы получите, если внесете это изменение:

let prefix_char s c = String.make 1 c ^ s

let suffix_char s c = s ^ String.make 1 c

Обновление

За годы, прошедшие с тех пор, как был задан этот вопрос, OCaml изменился, поэтому строки стали неизменяемыми. Отлично.

8 голосов
/ 04 декабря 2011

Я сделал сравнение эффективности разных подходов:

  1. Я написал простой тест:

    let append_escaped s c = s ^ Char.escaped c
    let append_make    s c = s ^ String.make 1 c
    let append_sprintf s c = Printf.sprintf "%s%c" s c
    
    let _ =
      let s = "some text" in
      let c = 'a' in
      for i = 1 to 100000000 do
        let _ = append_(*escaped|make|sprintf*) s c in ()
      done
    
  2. Я скомпилировал его изначально (Intel Core 2 Duo).

  3. Я выполнил тест три раза для каждого варианта, рассчитав его с помощью time и рассчитав среднее действительное истекшее время.

Вот результаты:

  1. s ^ String.make 1 c: 7,75 с ( 100% )

  2. s ^ Char.escaped c: 8.30 с ( 107% )

  3. Printf.sprintf "%s%c" s c: 68,57 с ( 885% )

8 голосов
/ 30 ноября 2011

String.make и String.blit - хороший способ сделать это, но они кажутся обязательными. Лично я предпочитаю делать инфиксные функции, используя Char.escaped и конкатенацию строк:

let (^$) c s = s ^ Char.escaped c (* append *)
let ($^) c s = Char.escaped c ^ s (* prepend *)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...