我有一个类型(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;
答案 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
异常很棘手。)