我有一个列表列表,例如[[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

09-27 06:32