String ocaml中的反转字符串

String ocaml中的反转字符串,string,ocaml,String,Ocaml,我有这个函数用于在ocaml中反转字符串,但是它说我的类型错误。我不确定为什么或者我能做什么:( 任何关于调试的提示都将不胜感激 28 let reverse s = 29 let rec helper i = 30 if i >= String.length s then "" else (helper (i+1))^(s.[i]) 31 in 32 helper 0 错误:此表达式具有char类型,但表达式应为char类型 串 谢谢我认为错

我有这个函数用于在ocaml中反转字符串,但是它说我的类型错误。我不确定为什么或者我能做什么:(

任何关于调试的提示都将不胜感激

  28 let reverse s =
  29   let rec helper i =
  30     if i >= String.length s then "" else (helper (i+1))^(s.[i])
  31   in
  32     helper 0
错误:此表达式具有char类型,但表达式应为char类型 串


谢谢

我认为错误消息非常清楚。表达式
s.[I]
表示一个字符(字符串的
I
第个字符)。但是
^
运算符需要字符串作为其参数

要解决此问题,可以使用
String.make 1 s.[i]
。此表达式提供一个包含单个字符
s.[i]
的单字符字符串


在OCaml中以递归方式处理字符串并没有它所能做到的那么好,因为没有很好的方法来分解字符串(将其分解为多个部分)。用于反转列表的等效代码看起来更漂亮。值得一提的是:-)

您的实现没有预期的(线性)时间和空间复杂性:它在时间和空间上都是二次的,因此它很难正确实现所请求的特性

字符串串联
sa^sb
分配一个大小为
length sa+length sb
的新字符串,并用这两个字符串填充它;这意味着它的时间和空间复杂性在长度的总和上都是线性的。当您对每个字符重复此操作一次时,将得到一个二次复杂度的算法(分配的内存总大小和总拷贝数将为
1+2+3+..+n

要正确实施此算法,您可以:

  • 分配一个预期大小的字符串,并使用输入字符串的内容对其进行适当的变异,反转

  • 创建一个由大小相反的字符串组成的
    字符串列表
    ,然后使用
    string.concat
    一次连接所有字符串(分配结果并只复制一次字符串)

  • 使用模块,该模块旨在以迭代方式累积字符或字符串,而不表现出二次行为(它使用动态调整大小策略,添加字符摊销常量时间)


第一种方法是最简单和最快的,但是在更复杂的应用程序中,如果您想连接字符串,那么其他两种方法会更有趣,但是一步就知道最终结果会是什么并不容易。

您也可以使用第三方库来实现这一点。已实现用于反转字符串的函数