我有一个列表列表,例如[[1; 2; 3]; [2]; [3; 4; 5; 6]; [7; 8; 9; 10]
我想将它们放在Hashtbl中,其中键是列表的长度,值是列表的列表,其中包含给定长度的所有子列表。
因此,对于上面的示例,哈希将如下所示
Key Value
1 [[2]]
3 [[1;2;3]]
4 [[3;4;5;6];[7;8;9;10]]
另外,我还尝试跟踪最长列表的长度,该数字是函数返回的值
执行此操作的代码如下。
let hashify lst =
let hash = Hashtbl.create 123456 in
let rec collector curmax lst =
match lst with
[] -> curmax
| h::t -> let len = (List.length h) in
(if ((Hashtbl.mem hash len)=true)
then ( let v = (Hashtbl.find hash len) in Hashtbl.add hash len v@[h] ) (* Line 660 *)
else ( Hashtbl.add hash len [h]));
(collector (max len curmax) t)
in
collector 0 lst
;;
现在,当我执行此操作时,上面的代码出现以下错误
File "all_code.ml", line 600, characters 50-72:
Error: This expression has type unit but an expression was expected of type
'a list
为什么Ocaml要求返回类型为“列表”,我该如何解决。
提前致谢
浦那
最佳答案
您可能应该在(v@[h])
中添加括号,以避免将其解析为(Hashtbl.add hash len v)@[h]
而且您可能不应该将123456传递给Hashtbl.create
,而是一个合理的质数,例如307或2017