【问题标题】:How to print and read file in OCaml如何在 OCaml 中打印和读取文件
【发布时间】:2014-07-05 20:07:45
【问题描述】:

我从一开始就关注 John Whitington 的书OCaml。在第 91-92 页中,他讨论了如何从 OCaml 打印和读取值。他声称代码

let rec read_dict()=
  let i=read_int () in
  if i=0 then
    [] 
  else
    let name=read_line in 
    (i, name):: read_dict ();;

read_dict();;

应该让我获取一些输入整数值和字符串值,然后返回给我一个包含对的列表。但是我不能在我的电脑上执行代码,也不能在 Try Ocaml 网站上成功执行。请问有什么问题吗?

我在 Windows IDE 中的 OCaml 顶层、Ubuntu 上的 utop 以及网站中的 Try OCaml 中进行了尝试。在第一个实例中,程序继续运行,什么也没有出现。在第二个中,它需要值但永远不会结束。在第三种情况下,它接受值,但是当我给一个字符串值时给我一条错误消息,如 One.

【问题讨论】:

  • 当你说它取值但永远不会结束时,你是否尝试将0 作为整数?这看起来像是应该结束输入。
  • 让我尝试在 Utop 中再次实现它。但是在 Try Ocaml 网站中,它确实以 0 结尾,但它不能采用任何字符串值。

标签: ocaml


【解决方案1】:

let name=read_line in 替换为let name = read_line () in,它应该可以在命令行上运行(虽然不是在顶层,这会与stdin 混淆)。

输入应该类似于

1
one
2
two
0

【讨论】:

  • 我试过你的代码,但它没有要求我输入任何内容。函数通过了。也许我应该用 utop 再试一次。
  • 它不会直接询问,而是开始阅读。您必须打印一份声明以使请求更好。
【解决方案2】:

让我们一步一步地尝试。首先创建一个名为input_dict.ml 的文件,然后在您喜欢的文本编辑器中打开它。

然后输入如下代码:

open Printf

let rec read_dict () =
  let i = read_int () in
  if i = 0 then [] else
    let name = read_line () in
    (i, name) :: read_dict ()

(* The entry point. Read a dictionary and print it out. *)
let _main : unit =
  let dict = read_dict () in
  printf "dict = { ";
  List.iter (fun (i,n) -> printf "%d => %s; " i n) dict;
  printf " }\n"

我在最后添加了一些打印,您可以确定它可以正常工作。

现在保存文件,进入 shell,确保您在包含文件的目录中,然后使用命令编译并运行您的程序:ocamlbuild input_dict.byte --。 (这两个尾随破折号指示ocamlbuild 在编译后运行程序)。最后看起来像这样:

$ ocamlbuild input_dict.byte --
42
Hello
56
World
0
dict = { 42 => Hello; 56 => World;  }

请注意,您不应在交互模式下运行此程序,因为您的输入将被 OCaml 解释器“吃掉”。

【讨论】:

  • 嗨!我运行了它,但没有任何显示。它只说“changwei@Sparkie-Vi​​rtual-Machine:~$ ocamlbuild input_dict.byte -- 00:00:00 完成,3 个目标(3 个缓存)。”
  • 我理解错了。现在它正在工作!谢谢!
  • 因为这是你应该说的,它等待你的输入。你应该输入42然后点击enter,然后你应该输入Hello然后点击回车,以此类推,直到你输入0。然后你就会看到答案。
猜你喜欢
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
  • 2014-12-29
  • 2012-03-21
  • 2021-12-20
相关资源
最近更新 更多