OCaml中字符串的操作

时间:2013-12-02 09:18:57

标签: string ocaml

我想在纯OCaml

中编写这些函数

长度:计算给定字符串的长度

getChar:与String.get相同,返回位于给定索引处的char。

我不能使用String模块或其他模块中的任何函数。字符串是其他语言的字符列表。或者如何将字符串转换为char列表?

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

据我所知,如果没有String.length,则无法获取string类型的值的长度。好吧,你可以写一个试图读取所有字符的循环,直到出现异常,但我觉得它很难看。

关于getChar我不认为它也可以做,除非你允许自己使用正常的方法来读取字符串:s。[i]。

如果你不能使用除OCaml原语以外的任何东西,我的猜测是你必须定义自己的字符串类型,可能是你建议的字符列表:

输入my_string = char list

然后,只需重新定义List.length和List.nth。

答案 1 :(得分:0)

字符串在ocaml中是必不可少的,我不认为它在内部使用列表。

答案 2 :(得分:0)

正如其他人所指出的那样,这个问题的说法有些矛盾。所有功能都是某些模块的一部分。最广泛使用的功能是Pervasives模块的一部分,它会自动为您打开。

假设想法只使用Pervasives中的函数,我看到的唯一可用操作是多态比较操作,连接运算符(^)和一些I / O操作。您还可以包含索引运算符.[],它是在编译器的帮助下实现的。但是你也可以排除它,因为它实际上只是String.get的另一个名称。

这还不足以进行有用的练习(据我所见)。您可以使用I / O操作找到字符串的长度,但我非常怀疑这是您正在寻找的内容。

let string_length s = (* Not what you really want *)
    let oc = open_out "/tmp/myfile" in
    output_string oc s;
    flush oc;
    let res = out_channel_length oc in
    close_out oc;
    res

使用字符列表而不是字符串可能更有意义。在OCaml中,这些是完全不同的类型。对于测试,您可以使用以下函数将字符串更改为字符列表。请注意,此功能不符合您声明的限制:

let list_of_string s =
    let rec ilist n =
        if n = String.length s then []
        else s.[n] :: ilist (n + 1)
    in
    ilist 0

使用模式匹配和Pervasives的功能,您可以使用列表执行许多操作。