मैं हास्केल के लिए नया हूं, और मैं ग्राफ और उनके नोड्स के लिए टाइपक्लास बनाने के साथ खेल रहा हूं। जब से मैं दोनों का निर्देशन किया और अनिर्दिष्ट रेखांकन चाहता हूँ, मुझेहास्केल प्रकार से मेल नहीं खा सकता है, कठोर चर
data Node = Node { label :: Char
, index :: Int
} deriving (Ord, Eq)
type Graph edgeType = ([Node], [edgeType])
data Edge = DirectedEdge {h :: Node, t :: Node}
| UndirectedEdge {a :: Node, b :: Node}
instance Show Node where
show n = ['(', label n, ')']
instance Show Edge where
show (DirectedEdge h t) = show h ++ "->" ++ show t
show (UndirectedEdge a b) = show a ++ "-" ++ show b
तो मैं निर्देशित और अनिर्दिष्ट किनारों के बीच भेद कर रहा हूँ है। एक ग्राफ में केवल किसी भी प्रकार के किनारों का होना चाहिए। ,
nodes :: [Node]
nodes = zipWith Node ['a'..] [0..]
emptyGraph :: [Node] -> Graph edgeType
emptyGraph ns = (ns, [])
अब तक तो अच्छा है लेकिन मैं एक समारोह connect
लिख रहा हूँ, एक मौजूदा ग्राफ एक नोड जोड़ता है के साथ: मैं भी निम्न है। आदर्श रूप में, मैं केवल इसे अप्रत्यक्ष ग्राफ पर लागू करना चाहता हूं, लेकिन यह एक विकल्प प्रतीत नहीं होता है। इसके बजाय, मैं कुछ इस तरह है:
connect :: Graph edgeType -> Node -> Graph edgeType
connect (ns, es) n = (n:ns, e:es)
where e = UndirectedEdge n (head ns)
लेकिन यह निम्न त्रुटि देता है:
Couldn't match type `edgeType' with `Edge'
`edgeType' is a rigid type variable bound by
the type signature for
connect :: Graph edgeType -> Node -> Graph edgeType
सबसे अच्छा तरीका है पूरा करने के लिए मैं क्या हासिल करने की कोशिश कर रहा हूँ क्या है?
धन्यवाद। क्या कोई तरीका है कि मैं 'गठबंधन' _only_ अप्रत्यक्ष ग्राफ पर लागू कर सकता हूं जैसा कि मैंने उन्हें परिभाषित किया है? 'कनेक्ट :: ग्राफ अप्रत्यक्ष एज -> नोड -> ग्राफ अप्रत्यक्ष एज' काम नहीं करता है। –
@ जोर्डन यह काम नहीं करता है क्योंकि 'अप्रत्यक्ष एज' एक "कन्स्ट्रक्टर" है और "टाइप" नहीं है। आपको लैम्बेडेक के सुझावों के साथ एक समाधान को देखने की ज़रूरत है, एज को दो अलग-अलग प्रकारों में विभाजित करना है। –