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

时间:2011-11-30 13:47:27

标签: string char ocaml

好像char -> string -> string类型的标准库中没有函数,它在char的前面(或末尾)插入string。有解决方法,例如使用String.makeString.blit。是否有一种优雅的方式来做到这一点?

3 个答案:

答案 0 :(得分:18)

@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已经改变,因此字符串是不可变的。优异。

答案 1 :(得分:8)

String.makeString.blit是一种很好的方法,但它们似乎势在必行。我个人更喜欢使用Char.escaped和字符串连接来创建中缀函数:

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

答案 2 :(得分:8)

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

  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. 我原生编译(英特尔酷睿2双核)。

  3. 我为每个选项运行了三次测试,使用time计时,并计算平均实际时间。

  4. 结果如下:

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

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

    3. Printf.sprintf "%s%c" s c:68.57s( 885%