Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 在OCAML中向循环中的列表添加元素_List_Loops_Ocaml - Fatal编程技术网

List 在OCAML中向循环中的列表添加元素

List 在OCAML中向循环中的列表添加元素,list,loops,ocaml,List,Loops,Ocaml,您好,我是OCAML的初学者,我想创建一个函数,在列表的末尾添加元素并返回此列表。这是我的密码: let test () : int list = let mylist = [] in for i = 1 to 3 do mylist@[i]; done; mylist;; 它说我的列表应该有类型单位。当我调用这个函数时,它返回一个空列表。有人能帮我吗?谢谢列表在OCaml中是不可变的。特别是这条线 mylist@[i]; 相当于 mylist@[i]; ()

您好,我是OCAML的初学者,我想创建一个函数,在列表的末尾添加元素并返回此列表。这是我的密码:

let test () : int list =
  let mylist = [] in
    for i = 1 to 3 do
      mylist@[i];
    done;
mylist;;

它说我的列表应该有类型单位。当我调用这个函数时,它返回一个空列表。有人能帮我吗?谢谢

列表在OCaml中是不可变的。特别是这条线

mylist@[i];
相当于

mylist@[i]; ()
或者换句话说,首先将列表
[i]
附加到mylist的末尾,然后丢弃此计算的结果。这就是为什么编译器警告您,
mylist@[i]
应该具有类型unit:unit是用于只执行副作用且不返回值的函数的结果类型

如果要创建
范围
函数,惯用的方法是定义递归函数

 let rec range start stop =
   if start > stop then
      ...
   else
      ... range (start+1) stop ...

列表在OCaml中是不可变的。特别是这条线

mylist@[i];
相当于

mylist@[i]; ()
或者换句话说,首先将列表
[i]
附加到mylist的末尾,然后丢弃此计算的结果。这就是为什么编译器警告您,
mylist@[i]
应该具有类型unit:unit是用于只执行副作用且不返回值的函数的结果类型

如果要创建
范围
函数,惯用的方法是定义递归函数

 let rec range start stop =
   if start > stop then
      ...
   else
      ... range (start+1) stop ...

Ocaml列表是不可变的,即它们不能更改。表情

mylist@[i]
创建一个新列表。然而,由于您对结果不做任何处理,因此它只是被丢弃。如果您想构建这样的列表,您需要将其存储在引用中

let l = ref [] in
for i = 0 to 3 do
  l := !l @ [i]
done;
List.iter (fun item -> print_int item; print_newline ()) !l
不过,我建议你换一种方式来做。附加两个列表是一个相当昂贵的操作,因为每次都会创建一个新列表并复制所有元素。一种更有效的方法是以相反的顺序创建列表,并使用
list.cons
(::运算符),这会在列表的开头添加新元素

let l = ref [] in
for i = 3 downto 0 do
  l := i :: !l
done;
List.iter (fun item -> print_int item; print_newline ()) !l
let rec l acc i =
  if i >= 0 then l (i :: acc) (i-1) else acc in
List.iter (fun item -> print_int item; print_newline ()) (l [] 3)
cons
操作以固定时间运行,因为它可以重用已经存在的列表

或者,也可以使用递归创建列表

let rec l i =
  if i <= 3 then i :: l (i+1) else [] in
List.iter (fun item -> print_int item; print_newline ()) (l 0)
这种变体效率高,尾部递归,但更难阅读(IMHO)

作为最后一句话,您可能想查看或
.

Ocaml列表是不可变的,即它们不能更改。表情

mylist@[i]
创建一个新列表。然而,由于您对结果不做任何处理,因此它只是被丢弃。如果您想构建这样的列表,您需要将其存储在引用中

let l = ref [] in
for i = 0 to 3 do
  l := !l @ [i]
done;
List.iter (fun item -> print_int item; print_newline ()) !l
不过,我建议你换一种方式来做。附加两个列表是一个相当昂贵的操作,因为每次都会创建一个新列表并复制所有元素。一种更有效的方法是以相反的顺序创建列表,并使用
list.cons
(::运算符),这会在列表的开头添加新元素

let l = ref [] in
for i = 3 downto 0 do
  l := i :: !l
done;
List.iter (fun item -> print_int item; print_newline ()) !l
let rec l acc i =
  if i >= 0 then l (i :: acc) (i-1) else acc in
List.iter (fun item -> print_int item; print_newline ()) (l [] 3)
cons
操作以固定时间运行,因为它可以重用已经存在的列表

或者,也可以使用递归创建列表

let rec l i =
  if i <= 3 then i :: l (i+1) else [] in
List.iter (fun item -> print_int item; print_newline ()) (l 0)
这种变体效率高,尾部递归,但更难阅读(IMHO)

作为最后一句话,您可能想查看或