在OCaml中使用长度函数

时间:2014-09-03 13:33:27

标签: 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;;

问题是,它似乎没有计算任何东西并直接到达EOF。 我收到以下错误消息:

Warning 10: this expression should have type unit.
Warning 10: this expression should have type unit.
Exception: End_of_file.

我真的不懂。我已经单独尝试了每一行,他们都工作了。我做错了什么?

谢谢!

1 个答案:

答案 0 :(得分:2)

OCaml没有可变变量。您应该使用tail recursionreferences。阅读任何基本的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 ....
;;

当然应该填充....