当我想将数组的元素与空列表连接时,为什么会得到一个类型单元?
Why do I get a type unit when I want to concatenate the element of the array with an empty list?
我正在尝试从给定的数组中创建一个列表,而在我的代码中它 return 是一个空列表。
我想知道为什么这不可能用列表来做。是不是因为我们应该在第三行 return 一些东西并且连接没有“保存”在任何地方?
let arrayTOlist a = let l =[] in
for i=0 to (Array.length a -1) do
[a.(i)]::l (*why does this have type unit?*)
done;
l;;
您代码中的值 l
是不可变的。所以没有什么可以改变它的初始值 []
。因此该函数将始终 return []
.
表达式 [a.(i)] :: l
没有改变 l
。它的值是每次迭代的长度为 1 的列表。然后丢弃该值(这会导致警告该值应具有类型单位)。
已经有一个函数 Array.to_list
,所以我认为这是一个家庭作业问题,因此没有必要使用 Array 模块中的其他函数重新实现 Array.to_list
。
最好的方法可能是使用将数组索引作为参数的递归函数。
如果我们尝试以下操作,它不会生成任何警告..
let arrayTOlist a = let l =[] in [a.(0)] :: l;;
val arrayTOlist : 'a array -> 'a list list = <fun>
所以我强烈认为这是 for 循环,因为它会生成警告。
我们可以通过阅读 OCaml 文档中关于 for 循环的 section 找到有关该行为的更多信息。
我正在尝试从给定的数组中创建一个列表,而在我的代码中它 return 是一个空列表。 我想知道为什么这不可能用列表来做。是不是因为我们应该在第三行 return 一些东西并且连接没有“保存”在任何地方?
let arrayTOlist a = let l =[] in
for i=0 to (Array.length a -1) do
[a.(i)]::l (*why does this have type unit?*)
done;
l;;
您代码中的值 l
是不可变的。所以没有什么可以改变它的初始值 []
。因此该函数将始终 return []
.
表达式 [a.(i)] :: l
没有改变 l
。它的值是每次迭代的长度为 1 的列表。然后丢弃该值(这会导致警告该值应具有类型单位)。
已经有一个函数 Array.to_list
,所以我认为这是一个家庭作业问题,因此没有必要使用 Array 模块中的其他函数重新实现 Array.to_list
。
最好的方法可能是使用将数组索引作为参数的递归函数。
如果我们尝试以下操作,它不会生成任何警告..
let arrayTOlist a = let l =[] in [a.(0)] :: l;;
val arrayTOlist : 'a array -> 'a list list = <fun>
所以我强烈认为这是 for 循环,因为它会生成警告。
我们可以通过阅读 OCaml 文档中关于 for 循环的 section 找到有关该行为的更多信息。