在OCaml中使用长度函数

在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;; 问题是,它似乎什么都不算,直接

我正在开始学习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.
我真的不明白。我试过每一行,它们都很有效。我做错了什么

谢谢

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 ....
;;

当然,你应该填写……

谢谢,它成功了!这确实是相当基本的。我应该更加小心,习惯它。再次感谢。顺便说一句,你做了什么?像我上面那样使用推荐信是一种耻辱,你会得到一个不好的分数。你需要编写一些局部尾部递归函数(我没有为你这么做,因为你需要思考)。好吧,目的是找到一种方法,用我的课程教给我的方法来计算文件中的每个字母。。。一点一点地,只是一个习惯语言的练习。如果下面的帖子回答了你的问题,请在答案旁边接受它。如果它仍然不能回答您的问题,请在您的问题中添加更多细节,以便有人能够回答。当您将答案标记为已接受时,它会浮到顶部,以便其他读者可以很快看到工作答案和答案的作者,您将获得一些声誉分数。