आप वास्तव में हेस्सेल में योजना के रूप में नेस्टेड सूचियों के बारे में नहीं सोच सकते हैं, क्योंकि वे समान डेटा संरचना नहीं हैं। एक हास्केल सूची समरूप है, जहां एक लिस्प "सूची" वास्तव में गुलाब के पेड़ के करीब है (जैसा कि नीचे सीएएमएमसीएन द्वारा इंगित किया गया है)। एक उदाहरण उदाहरण के रूप में, WYAS48 parsing sectionLispVal
को परिभाषित करता है, इस पर एक नज़र डालें।
तुम सच में, वास्तव में, वास्तव में क्रम प्रकार की जाँच करने के लिए है, भले ही यह आम तौर पर एक बुरा विचार और हास्केल में बहुत अपरंपरागत है चाहते हैं, Data.Typeable पर गौर। This response भी उपयोगी हो सकता है।
इस प्रश्न का वास्तविक जवाब यह है कि "आपको लिस्प में की तुलना में हास्केल में अपने तर्कों के बारे में सोचने की ज़रूरत है, जिसके परिणामस्वरूप कभी भी रनटाइम पर यह जांच करने की आवश्यकता नहीं होती है" (और मैं इसे एक सामान्य लिस्पर के रूप में कहता हूं, इसलिए मैं समझता हूं कि किस तरह से निराशाजनक है)।
Addendum: आपके संपादन के जवाब में, हास्केल की प्रकार प्रणाली स्वचालित रूप से यह सुनिश्चित करती है।यदि आपके पास foo :: [Int] -> Int
प्रकार का फ़ंक्शन है, उदाहरण के लिए, और आप इसे ["One", "Two", "Three"]
या [[1, 2, 3]]
पास करते हैं, तो आपको एक संकलन-समय त्रुटि मिल जाएगी जो आपको बताती है कि अभी क्या विस्फोट हुआ और क्यों। यदि आप किसी फ़ंक्शन को विशेषज्ञ बनाना चाहते हैं, तो बस एक और विशिष्ट प्रकार घोषित करें।
उदाहरण के लिए (इस तरह कोड लिखने नहीं है, यह सिर्फ निदर्शी प्रयोजनों के लिए है), कहते हैं कि तुम जैसे
myLookup index map = lookup index map
एक साधारण कार्य है आप GHCi में इस लोड और :t myLookup
चलाते हैं, यह बता दूँगा आप कि फ़ंक्शन का प्रकार myLookup :: Eq a => a -> [(a, b)] -> Maybe b
है जिसका अर्थ है कि यह Eq
(जो भी आप ==
चला सकते हैं) प्राप्त करने वाले किसी भी प्रकार की कुंजी ले सकते हैं। अब, कहें कि किसी भी कारण से आप यह सुनिश्चित करना चाहते हैं कि केवल कुंजी के रूप में उपयोग संख्याएं। आप यह सुनिश्चित होता है कि एक अधिक विशिष्ट प्रकार घोषणा
myLookup :: Int -> [(Int, a)] -> Maybe a
myLookup index map = lookup index map
अब जोड़कर, भले ही वहाँ समारोह अन्य प्रमुख प्रकार के साथ काम कर से रोक के शरीर में कुछ भी नहीं है, तो आप संकलन समय पर एक प्रकार त्रुटि मिलेगी यदि आप इसे Int
इंडेक्स या [(Int, a)]
मानचित्र के अलावा कुछ और पास करने का प्रयास करते हैं। नतीजतन, इस
myLookup :: Int -> [(Int, a)] -> Maybe a
myLookup ix lst = lookup ix lst
main :: IO()
main = putStrLn . show $ myLookup 1 [(1, "Foo")]
संकलन होगा और ठीक चलाते हैं, लेकिन इस
myLookup :: Int -> [(Int, a)] -> Maybe a
myLookup ix lst = lookup ix lst
main :: IO()
main = putStrLn . show $ myLookup "Nope.jpg" [("Foo", 1)]
न करेंगे। मेरी मशीन पर यह संकलन समय
/home/inaimathi/test.hs:5:35:
Couldn't match expected type `Int' with actual type `[Char]'
In the first argument of `myLookup', namely `"Nope.jpg"'
In the second argument of `($)', namely
`myLookup "Nope.jpg" [("Foo", 1)]'
In the expression:
putStrLn . show $ myLookup "Nope.jpg" [("Foo", 1)]
Failed, modules loaded: none.
मुझे उम्मीद है कि आपको आगे भ्रमित नहीं किया जाएगा।
सवाल यह है: आप यह क्यों चाहते हैं? आप इस फ़ंक्शन का उपयोग करने की योजना कैसे बनाते हैं? –
यदि आप एक सूची है तो क्या आप शायद प्रत्येक तत्व की जांच कर सकते हैं? – MatijaSh
यदि '[[[1, 2, 3]]]' मान्य इनपुट नहीं है, तो आपके फ़ंक्शन में गलत प्रकार है और आपको उस पर पुनर्विचार करने की आवश्यकता हो सकती है जिसे आप पूरा करने का प्रयास कर रहे हैं। –