ocaml - 如何在没有可变数据的情况下创建带有循环的图表?

标签 ocaml immutability mutual-recursion

我有下一个代码:

module MakeLink (Key : Map.OrderedType) = struct
   module Links = Map.Make (Key)

    type 'a t = 
      { links : 'a t Links.t;
        value : 'a
      }

    type key_t = Key.t

    let make value = 
      { links = Links.empty;
        value
      }

    let link linker ~to':linkable ~by:key = 
      { linker with links = 
        Links.add key linkable linker.links
      } 

   (* some functions for reading here *)
end

如何创建两个相互链接的链接? 我尝试过:

let join a ~with':b ~by:key = 
  let rec a' = link a ~to':b' ~by:key
      and b' = link b ~to':a' ~by:(Key.opposite key) in
  a'

But it's looking like a hen that hatched from their own egg. 我的问题是:如何使用(OCaml 或其他语言)在没有可变数据的情况下创建带有循环的图形(例如:双向链表)?

最佳答案

您可以使用 let rec 在 OCaml 中创建循环链接结构。

# type 'a g = { links: 'a g list; value: 'a };;
type 'a g = { links : 'a g list; value : 'a; }
# let rec a = { links = [b]; value = 5; }
      and b = { links = [a]; value = 6; };;
val a : int g =
  {links =
  ... many strange lines of output ...
val b : int g =
  {links =
  ... many more strange lines of output ...

然而,一旦有了这样的结构,就很难编写能够以有用的方式处理它的函数。我不认为你可以用 OCaml 这种热切的语言进行这种编程。实际上,您必须为链接使用可变字段。

我没有这方面的经验,但似乎更可能在 Haskell(一种非热切语言)中进行此类处理。

关于ocaml - 如何在没有可变数据的情况下创建带有循环的图表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26558133/

相关文章:

list - 如何将 txt 文件中的值解析为 OCaml 中的记录列表?

string - Go 中的不可变字符串

c# - 在非不可变类型中覆盖 == 运算符

reference - 如何避免在 Rust 中为可变和不可变引用编写重复的访问器函数?

javascript - 相互递归和 JSLint - 函数在定义之前被使用

lisp - Common Lisp 中的相互递归

http - 如何在 OCaml 中发出简单的 GET 请求?

macos - 使 OPAM 与 MacOS X 下的系统编译器一起工作

c++ - 我如何从 Ocaml 调用 C++ 代码,使用它自己的共享库 .so ?

haskell - Haskell相互递归的澄清