У меня есть список списков, например [[1; 2; 3]; [2]; [3; 4; 5; 6]; [7; 8; 9; 10] Я хочу поместить их в Hashtbl, где ключ - это длина списка, а значение - список списков, содержащий все подсписки данной длины.Ошибка Ocaml с оператором if
Таким образом, для примера выше хэша будет выглядеть следующим образом
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 [email protected][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 типа возврата «список и как я могу это исправить. Заранее спасибо Puneet
Попробуйте лучше отстудить свой код (большинство редакторов могут помочь вам с этим) и удалить бесполезные круглые скобки (см. код Томаса). OCaml может быть красивым для чтения, если вы используете для написания только то, что необходимо. –
Обратите внимание, что 'if Hashtbl.mem ... then let v = Hashtbl.find ...' является отходами (потому что 'Hashtbl' должен найти элемент дважды, один раз в' Hashtbl.mem' и один раз в 'Hashtbl.find') , и является «небезопасным» в том смысле, что позднее вы можете реорганизовать код таким образом, чтобы удалить инвариант, который вы только называете «Hashtbl.find», когда знаете ключ. 'Попробуйте Hashtbl.find ... с Not_found -> ...' быстрее и надежнее. – Ashe