List 在OCAML中向循环中的列表添加元素
您好,我是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]; ()
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)
作为最后一句话,您可能想查看或