String 如何在OCaml中将字符附加到字符串中?

String 如何在OCaml中将字符附加到字符串中?,string,char,ocaml,String,Char,Ocaml,在char->string->string类型的标准库中似乎没有函数,它将char插入到字符串的前面(或末尾)。有一些变通方法,例如使用String.make或String.blit。有一种优雅的方法可以做到这一点吗?String.make和String.blit是一种很好的方法,但它们似乎是必不可少的。就我个人而言,我更喜欢使用Char.escaped和字符串串联生成中缀函数: let (^$) c s = s ^ Char.escaped c (* append *) let ($^) c

char->string->string
类型的标准库中似乎没有函数,它将
char
插入到
字符串的前面(或末尾)。有一些变通方法,例如使用
String.make
String.blit
。有一种优雅的方法可以做到这一点吗?

String.make
String.blit
是一种很好的方法,但它们似乎是必不可少的。就我个人而言,我更喜欢使用
Char.escaped
和字符串串联生成中缀函数:

let (^$) c s = s ^ Char.escaped c (* append *)
let ($^) c s = Char.escaped c ^ s (* prepend *)

我将使用@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已经发生了变化,因此字符串是不可变的。非常好。

我比较了不同方法的效率:

  • 我写了一个简单的测试:

    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双)

  • 我为每个选项运行了三次测试,用
    时间对其计时,并计算平均实时运行时间

  • 结果如下:

  • s^String.make 1c
    :7.75s(100%

  • s^Char.c
    :8.30s(107%

  • Printf.sprintf“%s%c”s c
    :68.57s(885%


  • 我想说
    Char.escaped
    用于特殊用途,比如生成OCaml代码作为输出,或者编写人类可读的消息。对于普通情况,
    String.make 1c
    可能就是您想要的。这看起来确实有点笨拙。电池有
    BatString.of_char
    。感谢您对
    char.escaped
    的澄清。我保持答案不变,以便其他人知道。当@JeffreyScofield的答案和评论清楚了所有内容后,为什么要投否决票?使用
    Buffer
    可能更适合于增加字符串。请再次注意:
    Char.escaped
    String.make
    的作用不同。它根据OCaml的词汇规则为字符创建一个“转义”值。要查看这一点,请尝试以这种方式添加换行符(
    '\n'
    )。这也是为什么它有点慢。对于大多数一般用途,您希望使用
    String.make 1 c
    。当然,
    Printf.sprintf
    的速度要慢得多,但灵活得令人难以置信。@JeffreyScofield我将添加这个,这样人们就不需要自己尝试了:
    Char.escaped'\n'
    =
    “\\n”
    。谢谢,也许我应该自己说这个!这些评论仅限于非常简短。无论如何:
    Char.escaped'\n'
    提供一个由
    '\\'
    'n'
    组成的两个字符串
    String.make 1'\n'
    为您提供一个由
    '\n'
    组成的单字符字符串,它更可能是您想要的。