2016-08-02 23 views
-7

的曲線圖作爲兩個列表我有這樣的列表:代表在Haskell

[(1,1.0,0.0),(2,2.0,0.0),(3,2.0,1.0),(4,3.0,0.0),(5,3.0,1.0),(14,3.0,2.0),(6,4.0,0.0),(7,4.0,1.0),(13,4.0,2.0),(8,5.0,0.0),(9,5.0,1.0),(10,6.0,0.0),(11,6.0,1.0),(12,7.0,0.0)] 

其中第一元件是一個節點ID,第二個是X - 和第三一個ý - 協調。

第二列表表示

[(1,[2,3]),(2,[4,5]),(3,[14]),(4,[6]),(5,[7]),(14,[6,7,13]),(6,[8]),(7,[9]),(13,[]),(8,[10]),(9,[11]),(10,[12]),(11,[12]),(12,[13])]` 

其中第一元素是該節點的ID,以及相關聯的列表中包含的每個節點的後繼者。

我想要寫一個函數,它接受一個節點ID,同時返回節點本身和它的後繼者的相應Xÿ。例如:節點1個產量

[(1.0,0.0,2.0,0.0),(1.0,0.0,2.0,1.0)]

因爲節點1具有後繼者2(2.0,0.0)和3(2.0,1.0)

編輯:

我寫功能:

pairs [] = [] 
pairs ((nodeId,nodesucc):xs) = map (nodeId,) nodesucc : pairs xs 

pairsConcat = concat $ pairs $ edg graph2 

所以現在第二列表的樣子:

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

如何用4個元素創建元組?

+6

你試過了什麼。 – levi

+0

我不知道該怎麼做 – aabbcc

+0

你爲什麼要這樣做 – Gurkenglas

回答

1

我第二次以上的評論,你應該儘量多讀,但在案件的這個問題怎麼可能得到解決仍然是有用的例子:

這是不直接關係到你的問題,但在一般我會通過建議您使用NEWTYPE爲您的節點ID和位置啓動:

newtype Id = ID Int deriving (Eq, Ord) 
data Point = Point Int Int 

我也建議使用Data.Map來存儲這些數據,而不是關聯表:

neighbors :: Map Id [Id] 
points :: Map Id Point 

然後,這是一個簡單的解決方案,將其分解爲(1)獲取鄰近點和(2)將這一點加入所有這些點。這使用的是單粒組成的東西,可能會失敗,非常乾淨:

neighborPoints :: Id -> Maybe [Point] 
neighborPoints id = lookup id neighbors >>= sequence . map (flip lookup points) 

neighborPointsWithThisPoint :: Id -> Maybe [(Point, Point)] 
neighborPointsWithThisPoint id = do 
    p <- lookup points id 
    ps <- neighborPoints id 
    pure $ zip (repeat p) ps