我开始学习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;;
问题是,它似乎没有计算任何东西并直接到达EOF
。
我收到以下错误消息:
Warning 10: this expression should have type unit.
Warning 10: this expression should have type unit.
Exception: End_of_file.
我真的不懂。我已经单独尝试了每一行,他们都工作了。我做错了什么?
谢谢!
答案 0 :(得分:2)
OCaml没有可变变量。您应该使用tail recursion或references。阅读任何基本的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标准库stdlib/list.ml以获得一些灵感。
可能更好的解决方案从
开始let count_lines_and_characters fil = (* incomplete code, fill the ... *)
let rec ....
in ....
;;
当然你应该填充....