सम प्रकार - हास्केल में क्यों `शो (इंट। डबल)` से अलग है `(शो इंट) | (शो डबल) `


9

ये बराबर क्यों नहीं हैं?

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भी प्रकार के मापदंडों को नहीं लौटाता है , इसलिए कंपाइलर को इसे सभी संभव "शाखाओं" (इसलिए सभी संभावित प्रकारों) के साथ नहीं ले जाना पड़ता है।

क्या यह पसंद से है कि ऐसी सुविधा मौजूद नहीं है? या इसे लागू करना कठिन है जो मुझे लगता है?


2
एक if ... then ... else ..., एक ही प्रकार में thenऔर elseभाग की जरूरत है। आप इसे कुछ प्रोग्रामिंग भाषाओं में एक टर्नरी ऑपरेटर के रूप में देख सकते हैं।
विलेम वैन ओन्सेम

1
मैं इसके बारे में सहमत हूं making all conversions explicit। मेरे प्रश्न में, मैं नहीं चाहता कि हास्केल Intएक Doubleया इसके विपरीत डाली जाए । मैंने उदाहरण के तौर पर उन दो प्रकारों का उपयोग किया। आप हर जगह ले सकता है Intके साथ aऔर Doubleसाथ bमेरे सवाल का जहां दोनों प्रकार प्राप्त में Show। मैं समझता हूं कि anonymous sum typesहास्केल में कोई भी नहीं है , लेकिन मैं यह जानना चाहूंगा कि ऐसा क्यों है और हमें भाषा को डिजाइन करने से रोक रहा है।
मेहदी केसर

4
मुझे लगता है कि ऐसे प्रकारों को संघ प्रकार कहा जाता है । एक योग प्रकार अनिवार्य रूप से संघ प्रकार का एक टैग किया गया संस्करण है, जहां प्रत्येक मूल्य को आंतरिक प्रकार के मूल्य से परे एक बाएं / दाएं टैग को ले जाना चाहिए। मैं उम्मीद करता हूं कि यूनियन प्रकारों के साथ उस प्रकार के अनुमान, हास्केल की सभी प्रकार की स्तरीय विशेषताओं को प्राप्त करना बहुत कठिन है। यदि x :: Int | Boolऔर हमें संकलित करना है show x, तो यह जानने का कोई आसान तरीका नहीं है कि कॉल करने के लिए कौन से पॉइंटर-टू-फंक्शन का उपयोग करना है show, एक टाइप-इरेज़र आधारित आरटीएस में। हमें शायद रनटाइम के दौरान कुछ प्रकार के स्तर की जानकारी रखने की आवश्यकता होगी।
चि

1
अनाम राशि प्रकार न होना, हास्केल डिजाइनरों का एक डिजाइन निर्णय है। मुझे यकीन नहीं है कि वे किस तरह के लाभ को तालिका में लाएंगे, बिट मुझे लगता है कि वे चीजों को कहां उलझाएंगे। इसलिए मेरा अनुमान है कि लागत / लाभ अनुपात नहीं होने के कारण उन्हें छोड़ दिया गया है। लेकिन यह सुनिश्चित करने के लिए कि आपको मूल भाषा डिजाइनरों और / या वर्तमान अनुरक्षकों से पूछना चाहिए। मुझे नहीं लगता कि यह एक महान एसओ प्रश्न होगा, क्योंकि एक भाषा को डिजाइन करने में शामिल व्यक्तिगत राय और स्वाद का एक बड़ा सौदा है।
एन। 'सर्वनाम' मी।

4
(String, Int)अनाम नहीं है। यह मजाकिया वाक्य रचना के साथ सिर्फ एक नियमित उत्पाद प्रकार है। (String | Int)एक पूरी बहुत अलग होगा। अपने आप से पूछना शुरू करें कि क्या (Int|Int)समान होना चाहिए Intऔर क्यों।
एन। 'सर्वनाम' मी।

जवाबों:


8

एक अभिव्यक्ति के सभी भागों को अच्छी तरह से टाइप किया जाना चाहिए। इस प्रकार का if someCondition then someInt else someDoubleकुछ होना आवश्यक है exists a. Show a => a, लेकिन हास्केल उस तरह के अस्तित्व की मात्रा का समर्थन नहीं करता है।

अद्यतन: जैसा कि ची एक टिप्पणी में बताते हैं , यह तब भी संभव होगा यदि हास्केल को संघ / चौराहे प्रकार (जो योग / उत्पाद प्रकार के समान नहीं है) के लिए समर्थन था, लेकिन यह दुर्भाग्य से नहीं करता है।


क्या आप कृपया संघ / चौराहे के प्रकार और योग / उत्पाद प्रकार के बीच के अंतर पर विस्तार कर सकते हैं? मैंने हमेशा सोचा है कि वे एक ही थे, केवल गुमनामी को छोड़कर?
मेहदी केसर

1
@ मेहेदीसफ़र बेनामी के रूप में बेनामी, एक अनाम निर्माणकर्ता के रूप में नहीं। दूसरे शब्दों में, यदि आपके पास एक है Int ∪ Double, तो आपको पता होगा कि आपके पास दो में से एक है, लेकिन यह देखने के लिए पैटर्न मिलान करने में सक्षम नहीं होगा कि, इसलिए आप केवल उन चीजों को कर सकते हैं जो दोनों संभावनाओं के लिए करने के लिए मान्य होंगे।
जोसेफ सिबेल-रिबनेट मोनिका

2
स्पष्टता के लिए, टाइपस्क्रिप्ट में रनटाइम पर उपलब्ध जानकारी है, इसलिए इसमें एक typeofऑपरेटर है जो टैगिंग की कमी के लिए बना सकता है और देख सकता है कि किस प्रकार का उपयोग किया जाता है। हास्केल पूरी तरह से मिटा दिया गया है, इसलिए यदि यह इस सुविधा का समर्थन करता है, तो उसके बराबर नहीं होगा।
जोसेफ सिबल-रिनेटेट मोनिका

7

(,)हास्केल में हल्के वाक्यविन्यास के साथ उत्पाद प्रकार लिखे गए हैं । एक बात यह है कि एक हल्के वाक्यविन्यास के साथ एक राशि प्रकार, कुछ की तरह (Int | String), एक महान विचार होगा। वास्तविकता अधिक जटिल है। आइए देखें कि क्यों (मैं कुछ स्वतंत्रताएं ले रहा हूं Num, वे महत्वपूर्ण नहीं हैं)।

if someCondition then 42 else "helloWorld"

यदि इसे प्रकार का मान वापस करना चाहिए (Int | String), तो निम्नलिखित रिटर्न क्या होना चाहिए?

if someCondition then 42 else 0

(Int | Int)जाहिर है, लेकिन अगर यह सादे से अलग है Intतो हम गहरी परेशानी में हैं। तो (Int | Int)सादे के समान होना चाहिए Int

कोई तुरंत देख सकता है कि यह योग प्रकारों के लिए केवल हल्का वाक्यविन्यास नहीं है, बल्कि पूरी तरह से नई भाषा सुविधा है। यदि आप करेंगे तो एक अलग प्रकार की प्रणाली। क्या हमें एक होना चाहिए?

आइए इस फ़ंक्शन को देखें।

mysteryType x a b = if x then a else b

अब किस प्रकार का mysteryTypeहै? जाहिर है

mysteryType :: Bool -> a -> b -> (a|b)

सही? अब क्या होगा अगर aऔर bएक ही प्रकार के हैं?

let x = mysteryType True 42 0

यह स्पष्ट होना चाहिए Intक्योंकि हम पहले से सहमत हैं। अब mysteryTypeकभी-कभी एक अनाम राशि प्रकार लौटाते हैं, और कभी-कभी यह निर्भर नहीं करता है कि आप किस तर्क से गुजरते हैं। आप ऐसी अभिव्यक्ति से कैसे मिलान करेंगे? पृथ्वी पर आप इसके साथ क्या कर सकते हैं? "शो" जैसी तुच्छ चीजों को छोड़कर (या अन्य प्रकार की कक्षाएं जो भी इसका एक उदाहरण होगा), पूरी नहीं। जब तक आप भाषा में रन-टाइम प्रकार की जानकारी नहीं जोड़ते हैं, तब तक typeofयह उपलब्ध है - और यह हास्केल को पूरी तरह से अलग भाषा बनाता है ।

तो हाँ। Haskell एक टाइपस्क्रिप्ट क्यों नहीं है? क्योंकि हमें दूसरे टाइपस्क्रिप्ट की आवश्यकता नहीं है। यदि आप टाइपस्क्रिप्ट चाहते हैं, तो आप जानते हैं कि इसे कहां खोजना है।


1
@MichaWiedenmann सच कहूँ तो मुझे नहीं पता कि "प्रासंगिक" सही शब्द है। मुझे लगता है कि यह किसी न किसी तरह से मददगार है। हां मैंने एक पल के लिए रुककर सोचा कि क्या इसमें शामिल होना चाहिए। लेकिन मैं कई बार गलत होने के लिए जाना जाता हूं।
एन। 'सर्वनाम' मी।

कोई बात नहीं, इसकी अपनी पोस्ट, आप तय करें।
मीका विडेनमैन

तो आपके सर्वनाम क्या हैं?
dfeuer
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.