आप कार्यात्मक निर्भरताओं के साथ एक प्रकार के वर्ग से आश्रित प्रकार कैसे प्राप्त करते हैं और उपयोग करते हैं?आप कार्यात्मक निर्भरताओं के साथ एक प्रकार के वर्ग से आश्रित प्रकार कैसे प्राप्त करते हैं और उपयोग करते हैं?
स्पष्ट और मेरी नवीनतम प्रयास का एक उदाहरण देने के लिए (वास्तविक कोड से कम से कम मैं लिख रहा था):
class Identifiable a b | a -> b where -- if you know a, you know b
idOf :: a -> b
instance Identifiable Int Int where
idOf a = a
f :: Identifiable Int b => Int -> [b] -- Does ghc infer b from the functional dependency used in Identifiable, and the instance?
f a = [5 :: Int]
लेकिन GHC ख इसका अनुमान नहीं लगा है, ऐसा लगता है, के रूप में यह इस त्रुटि प्रिंट:
data Graph a where
Graph :: (Identifiable a b) => GraphImpl b -> Graph a
getImpl :: Identifiable a b => Graph a -> GraphImpl b
getImpl (Graph impl) = impl
वैकल्पिक हल यहाँ जोड़ने के लिए होगा:
Couldn't match expected type ‘b’ with actual type ‘Int’
‘b’ is a rigid type variable bound by
the type signature for f :: Identifiable Int b => Int -> [b]
at src/main.hs:57:6
Relevant bindings include
f :: Int -> [b] (bound at src/main.hs:58:1)
In the expression: 5 :: Int
In the expression: [5 :: Int]
In an equation for ‘f’: f a = [5 :: Int]
संदर्भ के लिए, यहाँ एक कम कम से कम उदाहरण है प्रकार आर्ग के रूप में ख ग्राफ़ बनाने के लिए:
data Graph a b | a -> b where
Graph :: (Identifiable a b) => GraphImpl b -> Graph a
पूरे संदर्भ: मैं संस्थाओं प्रत्येक एक आईडी है कि एक Graph
, प्रत्येक इकाई 1 नोड के लिए असाइन किया गया है। आप इकाई द्वारा एक नोड देख सकते हैं। मेरे पास Graph'
भी है जिसमें नोड्स (जिसे एक इकाई असाइन की जा सकती है) शामिल है, और नोड को देखने के लिए आपको नोड की आईडी प्रदान करने की आवश्यकता है, जो एक इंट है। Graph
आंतरिक रूप से Graph'
का उपयोग करता है। मेरे पास IdMap
है जो Graph'
में नोड्स के आईडी में इकाइयों की आईडी को मानचित्र करता है।
data Graph a where
Graph :: (Identifiable a b) => {
_idMap :: IdMap b,
_nextVertexId :: Int,
_graph :: Graph' a
} -> Graph a
उत्तर: यह मेरा Graph
परिभाषा है उपयोग प्रकार परिवारों, Daniel Wagner's answer देखते हैं। पूरी कहानी के लिए, Reid Barton's answer देखें।
@Carsten धन्यवाद, 'idOf' वास्तव में काम किया सेट कर सकते हैं। बाधा के लिए, मैं यह देखने की कोशिश कर रहा था कि कक्षा के साथ एक प्रकार के 'पैटर्न मैच' के लिए हैकेल में कोई सुविधा थी या नहीं। दूसरे उदाहरण के लिए, 'ग्राफ़ ए बी' का उपयोग किये बिना इसे काम करने का कोई तरीका है ए -> बी', और/या किसी भी डिजाइन परिप्रेक्ष्य से बाद में ऐसा करने का कोई कारण है? – timdiels