2015-10-16 12 views
8

जैसा कि मेरे previous question पर समझाया गया है, तो आपके नोड्स पर किसी प्रकार का अनूठा लेबल नहीं होने पर गठबंधन रणनीति को टाई करके दो ग्राफों को अलग करना असंभव है। एक उदाहरण के रूप में एक दो धार ग्राफ का उपयोग करना:क्या टाईंग-द-गाँठ रणनीति का उपयोग करके आलेख व्यक्त करने का सुविधाजनक तरीका है?

data Node = Node Int Node Node 

square = a where 
    a = Node 0 b c 
    b = Node 1 a d 
    c = Node 2 a d 
    d = Node 3 b c 

square लेखन कि जिस तरह से एक छोटे से असुविधाजनक और त्रुटि प्रवण लेबल मैन्युअल लिखने की जरूरत की वजह से है। उस तरह का पैटर्न आमतौर पर एक मोनड के लिए कॉल करेगा:

square = do 
    a <- Node b c 
    b <- Node a d 
    c <- Node a d 
    d <- Node b c 
    return a 

लेकिन मोनैड अनुक्रमिक होने के बाद भी यह नहीं किया जा सकता है। क्या टाईंग-द-गाँठ ग्राफ लिखने का कोई सुविधाजनक तरीका है?

+0

दिया [मेरे अन्य जवाब] (http://stackoverflow.com/a/33337598/477476), हो सकता है आपका यह विशेष उपयोग के मामले के लिए, बस गाँठ बांधने सुविधाजनक तरीका हो सकता है! – Cactus

उत्तर

10
{-# LANGUAGE RecursiveDo #-} 

import Control.Monad.State 

type Intividual a = State Int a 

data Node = Node Int Node Node 

newNode :: Node -> Node -> Intividual Node 
newNode a b = state $ \i -> (Node i a b, succ i) 

square :: Node 
square = (`evalState`0) $ mdo 
    a <- newNode b c 
    b <- newNode a d 
    c <- newNode a d 
    d <- newNode b c 
    return a 
+0

'रिकर्सिव डू', ठीक है, मुझे लगता है कि मैंने उस दिन के बारे में सुना है। आपके उत्तर के लिए धन्यवाद ... क्या मैं इस पर एक संक्षिप्त स्पष्टीकरण संपादित कर सकता हूं? – MaiaVictor

संबंधित मुद्दे

 संबंधित मुद्दे