2016-07-26 4 views
0

これは私のコードである:ハスケルのリストをチェックするには?

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

funcが私のGraph2をとるの重量を有するノード1からノード2へのエッジを有します、トポロジカルソートの頂点およびいくつかの数たとえば0を返します。 Funcは、ノードの内向きの度合いが0に等しいかどうかをチェックし、xがIdNodeであり、真グラフx == 0が真のときにyが増加するタプルのリストを作成します。頂点は

を削除し、ここに私の問題ですが、私はより多くの頂点が0度を持っているかどうかを確認し、1

EDIT追加したいされています

関数は次のように行動しなければならない:

topsort:リスト内の各ノードの[1,3,14,2,5,7,9,11,4,6,8,10,12,13]

  1. チェックインバウンド度。
  2. degreeが0の場合は、パス長に1を加えます(ノード1のインバウンドは等しいのでパス長= 1)
  3. ノードをグラフから削除し、ノードを削除してノードのインバウンド度をチェックし、ステップ2.

継続例:私はパスの長さに1を追加で結合したので= 0

ノード1を除去した後、ノード2および3が持っている(パスな長さ=ノード2 2及び3)及びノード2とノード3を削除します。

現在、インバウンド度= 0は14,4,5です。したがって、lengに1を追加しますth(path lenght = 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呼び出しでタプルを評価しますdepthdepthを呼び出すと、pairsの他のタプルが検索されます。グラフにサイクルがない場合、処理は最終的に で終了します。

ハスケルの遅延評価のため、depth への呼び出しが効果的にメモされます。

関連する問題