क्योंकि मैं सवाल दिलचस्प है, मैं इस विषय पर अपने विचारों को नीचे लिखने का फैसला किया:
तार्किक
हम "के रूप में सूची init xs
परिभाषित करते हैं, कि, यदि आप पर last xs
डाल कहो अपने अंत, XS के बराबर है यह बराबर है करने के लिए:।। init xs
अपने पिछले तत्व के बिना सूची है xs == []
के लिए, कोई अंतिम तत्व मौजूद है, इसलिए init []
अपरिभाषित हो गया है।
आप इस के लिए एक विशेष मामले के जोड़ सकता है, में की तरह "अगर XS खाली सूची है, तो init xs
खाली सूची, अन्यथा init xs
सूची है, वह यह है कि अगर आप अपने अंत पर last xs
शब्दों में कहें, बराबर है xs "। ध्यान दें कि यह कितना अधिक verbose और कम साफ है। हम अतिरिक्त जटिलता पेश करते हैं, लेकिन इसके लिए क्या?
सहज
init [1,2,3,4] == [1,2,3]
init [1,2,3] == [1,2]
init [1,2] == [1]
init [1] == []
init [] == ??
नोट कैसे समीकरणों के दाएँ हाथ की ओर पर सूचियों की लंबाई बाएं हाथ की ओर की लंबाई के साथ कम हो जाती है। मेरे लिए, इस श्रृंखला को एक समझदार तरीके से जारी नहीं रखा जा सकता है, क्योंकि दाएं तरफ की सूची का नकारात्मक आकार होना चाहिए!
प्रैक्टिकल
के रूप में अन्य लोगों ने बताया है, एक विशेष मामला init
या एक तर्क के रूप खाली सूची के लिए tail
के लिए से निपटने को परिभाषित करने, स्थितियों में मुश्किल से जगह त्रुटियों लागू कर सकते हैं कार्यों कोई समझदार हो सकता है जहां खाली सूची के परिणामस्वरूप, लेकिन अभी भी इसके लिए अपवाद नहीं बनाते हैं!
इसके अलावा, मैं सोच सकता हूं कि init []
[]
का मूल्यांकन करने के लिए वास्तव में इसका कोई फायदा नहीं होगा, तो उस अतिरिक्त जटिलता का परिचय क्यों दें? प्रोग्रामिंग सादगी के बारे में है और विशेष रूप से हास्केल शुद्धता के बारे में है, क्या आप सहमत नहीं होंगे?
init को सूची के अंतिम तत्व के अलावा सभी को वापस करना चाहिए। रिक्त सूचियों में अंतिम तत्व नहीं है, इसलिए कोई भी इनिट नहीं है। इसके अलावा, इनवेरिएंट 'xs == init xs ++ [last xs]' अब आपके पास वर्णित तरीके से परिभाषित नहीं किया जाएगा। –
@ निकलास, लेकिन इसी तरह, आप कह सकते हैं, init उन सभी तत्वों को वापस करना चाहिए जो अंतिम तत्व नहीं हैं, ऐसे कोई तत्व नहीं हैं इसलिए हमें खाली सूची वापस करनी चाहिए। – HaskellElephant
@ निकलास, क्या यह अभी भी नहीं होगा? मेरा मतलब है कि अगर आखिरी [] = [] –