作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了以下代码从列表中随机选择项目 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>
最佳答案
杰弗里斯科菲尔德说的,还有:
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
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/
我是一名优秀的程序员,十分优秀!