ये बराबर क्यों नहीं हैं?
show $ if someCondition then someInt else some double
तथा
if someCondition then show someInt else show someDouble
मैं समझता हूं कि यदि आप if ... elseपहले उदाहरण में भाग को एक अभिव्यक्ति से अलग करते हैं तो आप उसके प्रकार को एक अनाम राशि प्रकार के साथ नहीं Int | Doubleदिखा सकते हैं , जिस तरह का , जैसे आप टाइपस्क्रिप्ट में आसानी से कर सकते हैं (टाइपस्क्रिप्ट का उल्लेख करते हुए क्योंकि यह है मैं अक्सर इस्तेमाल करता था और जो सुम प्रकार का समर्थन करता है), और Eitherउसके बाद कॉल के आधार पर डेटा का उपयोग करना होगा show।
मैंने यहां जो उदाहरण दिया वह तुच्छ है, लेकिन मेरे लिए यह सोचने के लिए अधिक समझ में आता है "ठीक है हम कुछ दिखाने जा रहे हैं, और यह कुछ someCondition" पर निर्भर करता है "ठीक है" के बजाय अगर कुछ सच है तो कुछ दिखाओ अन्यथा कुछ दिखाओ ", और यह भी अनुमति देता है कम कोड दोहराव के लिए (यहां शो दो बार दोहराया जाता है लेकिन यह एक लंबा फ़ंक्शन अनुप्रयोग भी हो सकता है और इसके बजाय if ... else> 2 शाखाओं पर विचार करने के लिए हो सकता है)
मेरे दिमाग में कंपाइलर के लिए यह जांचना आसान होना चाहिए कि क्या योग के प्रकार (यहां Int | Double) बनाने वाले प्रत्येक प्रकार को showकार्य करने के लिए एक पैरामीटर के रूप में इस्तेमाल किया जा सकता है और यह तय करता है कि प्रकार सही हैं या नहीं। इससे भी बेहतर यह है कि showफ़ंक्शन हमेशा किसी stringभी प्रकार के मापदंडों को नहीं लौटाता है , इसलिए कंपाइलर को इसे सभी संभव "शाखाओं" (इसलिए सभी संभावित प्रकारों) के साथ नहीं ले जाना पड़ता है।
क्या यह पसंद से है कि ऐसी सुविधा मौजूद नहीं है? या इसे लागू करना कठिन है जो मुझे लगता है?
making all conversions explicit। मेरे प्रश्न में, मैं नहीं चाहता कि हास्केल Intएक Doubleया इसके विपरीत डाली जाए । मैंने उदाहरण के तौर पर उन दो प्रकारों का उपयोग किया। आप हर जगह ले सकता है Intके साथ aऔर Doubleसाथ bमेरे सवाल का जहां दोनों प्रकार प्राप्त में Show। मैं समझता हूं कि anonymous sum typesहास्केल में कोई भी नहीं है , लेकिन मैं यह जानना चाहूंगा कि ऐसा क्यों है और हमें भाषा को डिजाइन करने से रोक रहा है।
x :: Int | Boolऔर हमें संकलित करना है show x, तो यह जानने का कोई आसान तरीका नहीं है कि कॉल करने के लिए कौन से पॉइंटर-टू-फंक्शन का उपयोग करना है show, एक टाइप-इरेज़र आधारित आरटीएस में। हमें शायद रनटाइम के दौरान कुछ प्रकार के स्तर की जानकारी रखने की आवश्यकता होगी।
(String, Int)अनाम नहीं है। यह मजाकिया वाक्य रचना के साथ सिर्फ एक नियमित उत्पाद प्रकार है। (String | Int)एक पूरी बहुत अलग होगा। अपने आप से पूछना शुरू करें कि क्या (Int|Int)समान होना चाहिए Intऔर क्यों।
if ... then ... else ..., एक ही प्रकार मेंthenऔरelseभाग की जरूरत है। आप इसे कुछ प्रोग्रामिंग भाषाओं में एक टर्नरी ऑपरेटर के रूप में देख सकते हैं।