我在 OCaml 中编写反转列表函数时遇到了麻烦
I'm in trouble with writing reversing list function in OCaml
let rec reverse l =
let s = ref [] in
match l with
| [] -> !s
| hd::tl -> s := hd :: !s
reverse tl
也许我在最后 s := hd :: !s
部分遇到了麻烦。
我该如何解决这个问题?
一个问题是你有两个表达式:
s := hd :: !s
reverse tl
您需要将这些表达式连接成一个更大的表达式,以便按顺序计算它们。方法是使用 ;
(分号)运算符:
s := hd :: !s ;
reverse tl
你的另一个问题是你在每次递归调用中都有不同的s
。您需要对所有调用使用相同的 s
。
这样做的基本布局是有一个定义 s
的外部函数和一个使用这个 s
:
完成工作的内部递归函数
let outer_fun l =
let s = ref [] in
let rec inner_fun = ... in
inner_fun l
(作为附带评论,可能值得找出一种不使用引用的方法来执行此操作。学习编写纯函数是学习 OCaml 的最大好处之一,即使您不继续成为一名函数式程序员。)
let rec reverse l =
let s = ref [] in
match l with
| [] -> !s
| hd::tl -> s := hd :: !s
reverse tl
也许我在最后 s := hd :: !s
部分遇到了麻烦。
我该如何解决这个问题?
一个问题是你有两个表达式:
s := hd :: !s
reverse tl
您需要将这些表达式连接成一个更大的表达式,以便按顺序计算它们。方法是使用 ;
(分号)运算符:
s := hd :: !s ;
reverse tl
你的另一个问题是你在每次递归调用中都有不同的s
。您需要对所有调用使用相同的 s
。
这样做的基本布局是有一个定义 s
的外部函数和一个使用这个 s
:
let outer_fun l =
let s = ref [] in
let rec inner_fun = ... in
inner_fun l
(作为附带评论,可能值得找出一种不使用引用的方法来执行此操作。学习编写纯函数是学习 OCaml 的最大好处之一,即使您不继续成为一名函数式程序员。)