如何用循环构建图形并在OCaml中返回该图形?

时间:2016-04-20 16:41:33

标签: ocaml

我有一个类型(int * int list)列表的图形。目前是空的,如下所示:(5, []); (4, []); (3, []); (2, []); (1, [])]

我想从文件中读取并向该图添加边。 get_v1_v2使用bscanf和一个图形并返回带有新边缘的图形。它在顶层中作为单个命令工作,但是当我尝试将它合并到类似循环的东西时,我永远不能返回具有所有边的图形,它总是返回我的初始空图。我认为问题是确实增加了优势但是那个价值已经消失了。我无法想出让它发挥作用的方法。也许使用参考文献,但可能有更好的方法。

let file_name = open_in "a.txt" in 
let sb = Scanning.from_channel file_name in
try get_v1_v2 sb g; g;
with End_of_file -> g;

1 个答案:

答案 0 :(得分:2)

如果get_v1_v2返回新图表,则您不想返回g,这是图表。

所以,你应该

try get_v1_v2 sb g
with End_of_file -> g

但是,我在代码中没有看到g的任何定义。给一个完整的例子让我们看一下会好得多。

<强>更新

这是返回从通道读取的整数列表的代码。这可能与您的问题有所帮助。

let get_ints ch =
    let rec iget sofar =
        match
            try Some (Scanf.fscanf ch " %d" (fun x -> x))
            with End_of_file -> None
        with
        | None -> List.rev sofar
        | Some x -> iget (x :: sofar)
    in
    iget []

(处理End_of_file异常很棘手。)