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

问题描述 投票:0回答:2

我试图从给定的数组中创建一个列表,在我的代码中它返回一个空列表。 我想知道为什么列表不可能做到这一点。是因为我们应该在第三行返回一些东西并且连接没有“保存”在任何地方吗?

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;;
arrays list concatenation ocaml imperative-programming
2个回答
2
投票
代码中的值

l

 是不可变的。所以没有什么可以改变 
[]
 的初始值。因此该函数将始终返回 
[]

表达式

[a.(i)] :: l

 不会改变 
l
。每次迭代都有一个长度为 1 的列表值。然后该值被丢弃(这会导致警告该值应具有单位类型)。

已经有一个函数

Array.to_list

,所以我认为这是一个家庭作业问题,因此使用 Array 模块中的其他函数重新实现 
Array.to_list
 是没有意义的。

最好的方法可能是使用以数组索引作为参数的递归函数。


-1
投票
如果我们尝试以下操作,它不会生成任何警告..

let arrayTOlist a = let l =[] in [a.(0)] :: l;; val arrayTOlist : 'a array -> 'a list list = <fun>
所以我强烈认为这是 

for 循环,因为它生成了警告。

我们可以通过阅读 OCaml 文档中有关 for 循环的

部分找到有关该行为的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.