我有下一个代码:
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/