2

我有下一个代码:

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'

但它看起来就像一只从自己的鸡蛋中孵化出来的母鸡。 我的问题是:如何使用(以 OCaml 或其他语言)在没有可变数据的情况下创建带循环的图形(例如:双向链表)?

4

1 回答 1

2

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

# 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 中进行这种处理,这是一种非急切的语言。

于 2014-10-25T01:40:44.980 回答