如何检查Haskell中的列表?

时间:2016-07-26 10:32:36

标签: haskell

这是我的代码:

module Main where

import Data.Graph.Inductive
import Data.Graph.Inductive.Example

func :: Graph gr=> gr a b ->[Node]->Int-> [(Node,Int)]
func graph (x:xs) y
        |indeg graph x == 0 = (x,y+1):func (delNode x graph ) xs (y+1)

graph2:: Gr Int Int
graph2 = mkGraph (genLNodes 1 14)[(1,2,1),
                (1,3,1),    
                (3,14,1),
                (14,6,1),
                (14,7,1),
                (2,4,1),
                (2,5,1),
                (4,6,1),
                (5,7,1),
                (6,8,1),
                (7,9,1),
                (8,10,1),
                (9,11,1),
                (10,12,1),
                (11,12,1),
                (12,13,1),
                (14,13,1)]

Graph2有14个节点,例如(1,2,1)表示从节点1到节点2的边,权重为1.

Func采用我的Graph2,拓扑排序顶点和一些数字,例如0。 Func检查节点的向内度是否等于0并创建元组列表,其中x是IdNode,当indeg graph x == 0为真时y增加。顶点被删除

这是我的问题,我想看看更多顶点的度数是否为0并加1。

编辑:

该功能应如下:

topsort:[1,3,14,2,5,7,9,11,4,6,8,10,12,13]

  1. 检查列表中每个节点的入站程度。
  2. 如果degree等于0,则向路径长度添加1(节点1入口等于0,因此路径长度= 1)
  3. 从图中删除节点并在删除节点后检查入站的节点级别并返回步骤2.
  4. 继续示例:

    删除节点1后,节点2和3的入点= 0,所以我将路径长度加1(节点2和3的路径长度= 2),我删除节点2和3。

    现在in-bound degree = 0有14,4,5所以我将路径长度加1(路径长度= 3)并删除这些节点等等

    我希望图表的图像会有所帮助。 Graph

1 个答案:

答案 0 :(得分:2)

通过延迟评估,您可以使用“tie-the-knot”方法以声明方式计算深度:

minOr0 [] = 0
minOr0 ds = minimum ds

depths :: Graph gr => gr a b  -> [(Node, Int)]
depths gr =
  let pairs = [ (x, depth x) | x <- nodes gr ]
      depth x = 1 + minOr0 [ d | y <- pre gr x, let Just d = lookup y pairs ]
  in pairs

test2 = depths graph2

pairsdepth之间的定义是循环的:评估pairs次调用depth中的元组。致电depth会在pairs中查找其他元组。如果图形没有任何循环,则该过程最终将完成 终止。

由于懒惰评估在Haskell中的工作方式,对depth的调用 被有效地记忆。