在OCaml中使用长度函数
我正在开始学习OCaml,我一直被一个简单的问题困扰着。 我试图用一个简单的循环来计算一个6行文件中的字母数。 这是我的密码:在OCaml中使用长度函数,ocaml,Ocaml,我正在开始学习OCaml,我一直被一个简单的问题困扰着。 我试图用一个简单的循环来计算一个6行文件中的字母数。 这是我的密码: let fi = open_in "example";; let string = "";; let nb_carac = 0;; for i = 0 to 6 do string = input_line fi; nb_carac = (nb_carac + String.length(string)); done;; 问题是,它似乎什么都不算,直接
let fi = open_in "example";;
let string = "";;
let nb_carac = 0;;
for i = 0 to 6 do
string = input_line fi;
nb_carac = (nb_carac + String.length(string));
done;;
问题是,它似乎什么都不算,直接到达EOF
。
我收到以下错误消息:
Warning 10: this expression should have type unit.
Warning 10: this expression should have type unit.
Exception: End_of_file.
我真的不明白。我试过每一行,它们都很有效。我做错了什么
谢谢 OCaml没有可变变量。你应该使用或。阅读任何基本的OCaml教科书或教程
两行:
string = input_line fi;
nb_carac = (nb_carac + String.length(string));
被理解为无用的相等性测试(这解释了您得到的警告)
也许你想要:
(* shameful *)
let string = ref "";;
let nb_carac = ref 0;;
然后,例如
(* shameful *)
string := input_line fi;
nb_carac := !nb_carac + String.length(!string);
但是,如果您使用像OCaml这样的函数式语言编写代码,那么您应该会得到一个非常糟糕的分数
根据经验,在OCaml中编码时避免数据突变。当然,这条规则也有一些重要的例外
正确的解决方案是使用不会改变任何数据的尾部递归函数。请看OCaml标准库以获得一些启示
也许更好的解决方法是从
let count_lines_and_characters fil = (* incomplete code, fill the ... *)
let rec ....
in ....
;;
当然,你应该填写……谢谢,它成功了!这确实是相当基本的。我应该更加小心,习惯它。再次感谢。顺便说一句,你做了什么?像我上面那样使用推荐信是一种耻辱,你会得到一个不好的分数。你需要编写一些局部尾部递归函数(我没有为你这么做,因为你需要思考)。好吧,目的是找到一种方法,用我的课程教给我的方法来计算文件中的每个字母。。。一点一点地,只是一个习惯语言的练习。如果下面的帖子回答了你的问题,请在答案旁边接受它。如果它仍然不能回答您的问题,请在您的问题中添加更多细节,以便有人能够回答。当您将答案标记为已接受时,它会浮到顶部,以便其他读者可以很快看到工作答案和答案的作者,您将获得一些声誉分数。