如何在OCaml中打印和读取文件

时间:2014-05-17 11:58:31

标签: ocaml

我从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 网站中成功执行。请问有什么问题?

我尝试在OCAMl中使用Windows IDE,在Ubuntu上的 utop 以及网站上的 Try OCaml 。在第一个例子中,程序继续运行,没有任何东西出现。在第二个它需要价值但永远不会结束。在第三个实例中,它接受值,但是当我给出像One这样的字符串值时,会给出一条错误消息。

2 个答案:

答案 0 :(得分:3)

let name=read_line in替换为let name = read_line () in,它应该在命令行工作(尽管不在顶层,这会弄乱stdin)。

输入应该类似于

1
one
2
two
0

答案 1 :(得分:3)

让我们一步一步来试试吧。首先创建一个名为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解释器“吃掉”。