我想在纯OCaml
中编写这些函数长度:计算给定字符串的长度
getChar:与String.get相同,返回位于给定索引处的char。
我不能使用String模块或其他模块中的任何函数。字符串是其他语言的字符列表。或者如何将字符串转换为char列表?
感谢您的帮助。
答案 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的功能,您可以使用列表执行许多操作。