【问题标题】:Using length function in OCaml在 OCaml 中使用长度函数
【发布时间】:2014-09-04 01:27:28
【问题描述】:

我开始学习 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.

我真的不明白。我已经单独尝试了每一行,它们都有效。我做错了什么?

谢谢!

【问题讨论】:

  • 如果下面的帖子回答了您的问题,请通过答案旁边的clicking on the check sign 接受。如果它仍然没有回答您的问题,请在您的问题中添加更多详细信息,以便有人可以回答。当您将答案标记为已接受时,它会浮动到顶部,以便其他读者可以很快看到有效的答案和答案的作者,并且您会获得一些声誉积分。

标签: ocaml


【解决方案1】:

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

当然你应该填写....

【讨论】:

  • 谢谢,成功了!这确实很基本。我应该更加小心并习惯它。再次感谢您。
  • 顺便说一句,什么有效?像我上面那样使用引用是一种耻辱,你会得到一个糟糕的成绩。你需要编写一些本地尾递归函数(我没有为你这样做,因为你需要思考)。
  • 嗯,我们的目的是找到一种方法来计算文件中的每个字母,以及我迄今为止所教给我的内容……只是一个练习,让我一点一点地习惯这种语言。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多