Простой неоптимальный unionfind в OCaml

Я написал программу OCaml дляunion find алгоритм. Этот алгоритм, который я написал, не является оптимальным и является самой простой версией.

Я поместил свой код OCaml здесь, потому что я не уверен, достаточно ли этот код хорош(несмотря на сам алгоритм), хотя этот код может работать без ошибок.

Впервые я написал полный рабочий материал после того, как начал изучать OCaml, поэтому, пожалуйста, помогите мне, ознакомившись с ним.

Полезные предложения помогут мне улучшить свои навыки OCaml. Спасибо

type union_find = {id_ary : int array; sz_ary : int array};;

let create_union n = {id_ary = Array.init n (fun i -> i); 
                  sz_ary = Array.init n (fun i -> 1)};;

let union u p q = 
  let rec unionfy id_ary i = 
    let vp = id_ary.(p) in
    let vq = id_ary.(q) in
    if i < Array.length id_ary then begin 
      if i != q && id_ary.(i) = vp then id_ary.(i) <- vq;
      unionfy id_ary (i + 1)
    end 
    else print_string "end of union\n"
  in
  unionfy u.id_ary 0;;

let is_connected u p q = u.id_ary.(p) = u.id_ary.(q);;

Прежде всего,

Я создаю структуру данныхunion (как вunion find) правильно?

Должен ли я включить два массива внутри или есть какой-нибудь лучший способ?

Во-вторых,

Я используюarray в этом коде, ноarray являетсяmutable что не так хорошо дляfp правильно?

Есть ли способ избежать использования массива?

В заключение,

В целом, достаточно ли этот кусок кода?

Что-нибудь может быть улучшено?

Постскриптум Я пока не использую объектно-ориентированный бит OCaml, так как не научился этому.

Ответы на вопрос(2)

Ваш ответ на вопрос