gpt4 book ai didi

ocaml - 如何从 OCaml 的 for 循环中获取值

转载 作者:行者123 更新时间:2023-12-04 16:29:45 25 4
gpt4 key购买 nike

我编写了以下代码从列表中随机选择项目 n 项并将选择项放入新列表中
代码如下

let random_extract list n =
let l = ((List.length list)- 1)
and acc = [] in
for i = 1 to n do
(List.nth list (Random.int l) ) :: acc (* Line 447 *)
done;
acc
;;

当我加载包含此代码的文件时,出现以下错误
File "all_code.ml", line 447, characters 2-40:
Warning 10: this expression should have type unit.
val random_extract : 'a list -> int -> 'b list = <fun>

两个问题,
问题1:这个警告是什么意思。

其次,当我运行这个函数时,我没有得到预期的列表,而是一个空的列表。

问题 2:如何从 for 循环内部获取 acc 的值

最佳答案

杰弗里斯科菲尔德说的,还有:

let random_extract list n =
let l = ((List.length list)- 1)
and acc = ref [] in
for i = 1 to n do
acc := (List.nth list (Random.int l) ) :: !acc (* Line 447 *)
done;
!acc

如果您打算使用 for循环类似的东西,然后 acc必须是一个引用,即一个可变值。一般在 Ocaml 和 ML 中 let x = ...定义一个不可变的值。接下来,当你写 (List.nth list (Random.int l)) :: acc ,这只是意味着“看,我可以列出一个 list ”。你没说新构造的列表必须分配给任何东西,特别是它没有分配给 acc (它不能,因为 acc 是不可变的)。 Ocaml 发出警告是因为它看到您的 for 的正文循环生成一个列表,但 Ocaml 知道 for 的主体循环应该产生一个单元(C/C++/Java 错误术语中的“void”)。

使用 for像这样循环很丑陋。正确的方法是这样做:
let random_extract lst =
let l = List.length lst - 1 in
let rec extract = function
| 0 -> []
| n -> List.nth lst (Random.int l) :: extract (n - 1)
in
extract

如果你是 Ocaml 的新手,你真的应该花时间完全理解上面的代码。之后,您应该研究以下代码,并确保您了解为什么它比第一个版本更有效(查找“尾递归”):
let random_extract lst =
let l = List.length lst - 1 in
let rec extract acc = function
| 0 -> acc
| n -> extract (List.nth lst (Random.int l) :: acc) (n - 1)
in
extract []

关于ocaml - 如何从 OCaml 的 for 循环中获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9272454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com