似乎在类型的标准库中没有函数char -> string -> string,它在a char的前面(或者在a的末尾插入)string.有解决方法,例如使用String.make或String.blit.有一种优雅的方式来做到这一点?
Jef*_*eld 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
Run Code Online (Sandbox Code Playgroud)
更新
自从提出这个问题以来的几年里,OCaml已经改变,因此字符串是不可变的.优秀.
String.make这String.blit是一个很好的方法,但它们似乎是必要的.我个人更喜欢使用Char.escaped和字符串连接来创建中缀函数:
let (^$) c s = s ^ Char.escaped c (* append *)
let ($^) c s = Char.escaped c ^ s (* prepend *)
Run Code Online (Sandbox Code Playgroud)
我对不同方法的效率进行了比较:
我写了一个简单的测试:
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
Run Code Online (Sandbox Code Playgroud)我原生编译(Intel Core 2 Duo).
我为每个选项运行了三次测试,计时time并计算平均实时时间.
结果如下:
s ^ String.make 1 c:7.75秒(100%)
s ^ Char.escaped c:8.30s(107%)
Printf.sprintf "%s%c" s c:68.57s(885%)
| 归档时间: |
|
| 查看次数: |
14471 次 |
| 最近记录: |