函数 returns 在 OCaml 中倒序排列

function returns list in reverse order in OCaml

我想从一个文件中读取一些数字,将它们放到一个列表中,最后将它们显示在屏幕上。 numbers.txt 目前有 2 3 5 7 11 但是作为输出我得到 11 7 5 3 2 - : unit = ()

为什么会这样?

let rec int_list_from_sb sb n = 
match n with 
| 0 -> [];
| _ -> (bscanf sb " %d" (fun a -> a))::(int_list_from_sb sb (n - 1));;

let file_name = open_in "numbers.txt" in 
let sb = Scanning.from_channel file_name in 
let int_list = int_list_from_sb sb 5 in
List.iter (fun a -> print_int a) int_list;;

参数的计算顺序在 OCaml 中未指定。因此,当您执行 f x :: g y 时,未指定 fg 是否先被调用。在您的情况下,递归调用是在调用 bscanf 之前调用的,这就是为什么您以错误的顺序获得结果的原因。

解决求值顺序问题的一般方法是在副作用的顺序很重要时将函数的参数放入局部变量中。因此,如果您希望 f x 的效果在 g 被调用之前发生,您应该执行 let fx = f x in fx :: g y 而不是 f x :: g y

但是在您的情况下,您可以像这样使用 bscanf 的延续参数:

bscanf sb " %d" (fun a -> a :: int_list_from_sb sb (n - 1))