ये बराबर क्यों नहीं हैं?
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
भाग की जरूरत है। आप इसे कुछ प्रोग्रामिंग भाषाओं में एक टर्नरी ऑपरेटर के रूप में देख सकते हैं।