当我想将数组的元素与空列表连接时,为什么会得到一个类型单元?

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 找到有关该行为的更多信息。