हास्केल में, कुछ सूचियों चक्रीय हैं:क्या हास्केल में चक्रीय सूचियों का पता लगाने की क्षमता भाषा के किसी भी गुण को तोड़ देगी?
ones = 1 : ones
दूसरों नहीं हैं:
nums = [1..]
और फिर वहाँ इस तरह की बातें कर रहे हैं:
more_ones = f 1 where f x = x : f x
यह ones
रूप में एक ही मूल्य को दर्शाता है , और निश्चित रूप से वह मान एक दोहराव अनुक्रम है। लेकिन क्या यह चक्रीय डेटा संरचना के रूप में स्मृति में दर्शाया गया है संदिग्ध है। (एक कार्यान्वयन ऐसा करने के सकता है, लेकिन this answer explains that "it's unlikely that this will happen in practice"।)
मान लीजिए हम एक हास्केल कार्यान्वयन लेते हैं और इसे हैक निर्मित एक समारोह isCycle :: [a] -> Bool
कि तर्क के में स्मृति प्रतिनिधित्व की संरचना जांच करता है। यह True
देता है यदि सूची शारीरिक रूप से चक्रीय है और False
है तो तर्क सीमित लंबाई का है। अन्यथा, यह समाप्त करने में विफल हो जाएगा। (मैं "में यह हैकिंग" कल्पना क्योंकि यह हास्केल में है कि समारोह में लिखने के लिए असंभव है।)
इस समारोह के अस्तित्व भाषा के किसी भी दिलचस्प गुण तोड़ सकते हैं?
ठीक है, आप अचानक एक ही इनपुट के लिए अलग-अलग मान वापस कर सकते हैं: 'f x = ifCycle x तो 1 else 2' है। यह उसी सूची को बनाने के तरीके के आधार पर '''' या '2' मान' के लिए वापस करेगा। यह बहुत बड़ा ब्रेकेज लगता है कि कार्यात्मक भाषाओं के सबसे स्पष्ट फायदों में से एक यह है कि इनपुट में समान मान दिए जाने पर एक फ़ंक्शन हमेशा एक ही परिणाम देगा ... – Bakuriu
यह केवल 'आईओ' को बाधित होने पर स्वीकार्य माना जाता है । [डेटा-रीफाई] से प्राप्त सूची के आलेख की स्पष्ट संरचना के संदर्भ में आप 'isCycle :: [a] -> IO Bool 'लिख सकते हैं (https://hackage.haskell.org/package/data-reify) जो आंतरिक रूप से ['StableName's] का उपयोग करता है (http://hackage.haskell.org/packages/archive/base/latest/doc/html/System-Mem-StableName.html#t:StableName)। यदि आप 'आईओ' के साथ स्मृति में बहुत मेहनत करते हैं तो आप पूरी तरह से बुरी चीजें कर सकते हैं, जैसे [कुछ भी 'असुरक्षित' का उपयोग किए बिना शुद्ध कार्यों की शुद्धता को तोड़ें] (http://stackoverflow.com/a/28701687/414413)। – Cirdec
जांच कर रहा है कि कोई सूची भौतिक रूप से चक्रीय है, तब तक चक्र न मिलने तक सभी नोड्स की जांच करने की आवश्यकता होगी। यह हास्केल में अनंत सूची पर समाप्त नहीं होगा। हालांकि यह लिस्प (और शायद सभी अनिवार्य भाषाओं) में होगा, क्योंकि चक्रीय सूची अनंत सूची करने का एकमात्र तरीका है। – mb14