如何在Haskell中定义类似于DAG的树

如何在Haskell中定义类似于DAG的树,haskell,data-structures,tree,directed-acyclic-graphs,Haskell,Data Structures,Tree,Directed Acyclic Graphs,如何定义Haskell中最好的有向无环图(DAG)(字符串)(有一个根) 我特别需要尽快在此数据结构上应用以下两个函数: 查找一个元素的所有(直接和间接)祖先(包括父元素的父元素等) 查找一个元素的所有(直接)子元素 我想到了[(String,[String])],其中每一对都是图形的一个元素,由其名称(String)和一个字符串列表([String])组成,其中包含该元素(直接)父元素的名称。这个实现的问题是很难完成第二个任务 当字符串列表([String])包含(直接)子项的名称时,您也可以

如何定义Haskell中最好的有向无环图(DAG)(字符串)(有一个根)

我特别需要尽快在此数据结构上应用以下两个函数:

  • 查找一个元素的所有(直接和间接)祖先(包括父元素的父元素等)
  • 查找一个元素的所有(直接)子元素
  • 我想到了
    [(String,[String])]
    ,其中每一对都是图形的一个元素,由其名称(
    String
    )和一个字符串列表(
    [String]
    )组成,其中包含该元素(直接)父元素的名称。这个实现的问题是很难完成第二个任务

    当字符串列表(
    [String]
    )包含(直接)子项的名称时,您也可以再次使用
    [(String,[String])]
    。但在这里,第一项任务很难完成

    我能做什么?还有什么替代方案?哪种方法最有效


    编辑:还有一句话:我也希望它能很容易地定义。我必须自己“手动”定义此数据类型的实例,因此我希望避免不必要的重复。

    您看过吗?每个节点都表示为包含其子节点和父节点的上下文。有关如何访问此文件的信息,请参见type类。它可能不像您要求的那么简单,但它已经存在了,经过良好测试并且易于使用。我已经在一个大型项目中使用它十多年了。

    datafamily=Ego{parents,children:[String]};类型DAG=映射字符串族
    ?如果你存储了父母和孩子,两个查找操作都应该相当快。或者有两个地图。一是从父母到孩子,二是从孩子到父母。选择最适合您的方式。我在原始问题中添加了一个额外的备注,这使得您的建议很难。@MekeorMelire定义您自己的类似地图的数据类型。您可以从
    类型映射kv=[(k,v)]
    开始。便宜、快速、正确,选择两个。呃,你可以有两个1。轻松/快速找到父母,2。轻松/快速找到儿童,3。简单表示法。考虑一下折衷并选择你的观点。关于Haskell地图的速度有什么想法吗?我想使用这个库,但我的图相当大。