2016-07-26 37 views
0

這是我的代碼:如何查看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圖x == 0爲真時,y正在增加。頂點被刪除

,這裏是我的問題,我想看看是否有更多的頂點度爲0,並添加1

編輯:

該函數應該如下行動:

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

  1. 檢查列表中每個節點的入境程度。
  2. 如果度數等於0,則向路徑長度加1(節點1入站等於0,因此路徑長度= 1)
  3. 從圖中刪除節點並檢查節點移除節點的入境度並返回步驟2.持續例如

移除節點1後,節點2和3具有在結合的= 0,所以我加1,路徑長度(路徑lenght = 2節點2和3)和我刪除節點2和3.

現在入境度= 0有14,4,5所以我加1路徑leng th(路徑長度= 3),我刪除這些節點等等

我希望圖形的圖像會有所幫助。 Graph

+7

目前還不清楚你在問什麼。它看起來似乎與「檢查列表」沒有太大關係請重新描述你想要做什麼,最好是用你想定義的函數的類型簽名。另外:請正確使用markdown:內嵌代碼片段如'[(1,1)]'應該反引號,如下所示:''我加1('[(1,1)]')''。 _And_:儘量保持示例最小化。就這個問題而言,你的這張圖肯定不是那麼簡單。 – leftaroundabout

回答

2

懶的評價可以用「結合的結」的方法來計算深處很聲明:

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 的調用。