हास्केल ने इसे एक साधारण पुस्तकालय समारोह के रूप में परिभाषित करने के बजाय "यदि / फिर / कहीं" क्यों बनाया है?


25

हास्केल के पास एक अंतर्निहित पुस्तकालय if/then/elseहै, जो Boolएक साधारण पुस्तकालय समारोह के बजाय, प्रकार पर निर्भर है ? जैसे कि

if :: Bool -> a -> a -> a
if True  x _ = x
if False _ y = y

4
मुझे लगता है कि वे स्पष्ट रूप से चाहते थे अगर / फिर / अन्यथा सिंटैक्स जो उन्हें मिक्सफिक्स फ़ंक्शन के बिना नहीं मिल सकता है जैसे कि वे एग्डा में हैं। आप जिस फ़ंक्शन का उल्लेख करते हैं, उसे एक टर्नरी के रूप में संरचित किया जाता है, जिसे आप स्वयं कार्यान्वित कर सकते हैं हालांकि मुझे लगता है कि उन्होंने हमें दिया है अगर / या फिर चीनी (यह एक मामले में चीनी की संभावना है) सिर्फ इसलिए कि वे कर सकते हैं और यह हानिरहित है .. लेकिन मेरे पास कुछ भी नहीं है मुझे यहाँ वापस करने के लिए, यही कारण है कि मैं यह एक टिप्पणी में लिख रहा हूँ।
जिमी होफा

10
यह अधिकांश पाठकों के लिए स्पष्ट हो सकता है, लेकिन मैं यह बताना चाहूंगा कि एक समारोह के रूप में elsef / उसके बाद होना एक उत्सुक भाषा में एक अच्छा समाधान नहीं होगा (जैसे स्कीम या sml) जबकि यह एक आलसी में उचित है हास्केल जैसी भाषा।
जियोर्जियो

जवाबों:


24

यह अच्छा चीनी के लिए विशुद्ध रूप से है if, thenऔर elseकीवर्ड; वास्तव में, जीएचसी ( RebindableSyntaxविस्तार सक्षम होने के साथ) सिंटैक्स को केवल ifThenElseफ़ंक्शन के दायरे में जो भी हो, उसे कॉल करके अलग कर देगा ।


6

यह बहुत ज्यादा मायने नहीं रखता है ... मेरे लिए ऐसा लगता है जैसे कि / फिर / अन्यथा आजकल बहुत अधिक उपयोग नहीं किया जाता है। मैं अपने आप को पैटर्न गार्ड लिख रहा हूँ अगर .. अगर ..

एक वाक्यात्मक दृष्टिकोण से, हालांकि, यह अच्छा है

if expr1 then expr2 else expr3

तो आप लिख सकते हैं

if foo a then bar b else baz c

के बजाय

if (foo a) (bar b) (baz c)

जो मुझे बहुत थोड़ा सा लगता है।

सिमेंटिक एनालिसिस और कोड जेनरेशन के लिए, यह निर्माण अच्छा है, जिसे आसानी से कुशल मशीन कोड में संकलित किया जा सकता है। ध्यान दें कि कोड उस हिस्से को छोड़ सकता है जो उस शाखा के लिए थंक बनाता है जो पहुंच नहीं गया है, फ़ंक्शन कॉल के विपरीत, जहां (अविकसित) पैरामीटर सभी पास होने चाहिए। लेकिन यह भी समय (और स्मृति, कि बाद में पुनः प्राप्त किया जाना चाहिए) को बनाने के लिए समय लगता है। इस पर अच्छा बनाने के लिए, हर जगह अगर फ़ंक्शन को इनलाइन करना होगा।


3
मुझे नहीं लगता कि इनलाइनिंग एक वास्तविक मुद्दा है। मेरी समझ यह है कि जीएचसी पहले से ही छोटे-छोटे कार्यों को पूरा करने में असाधारण रूप से अच्छा है, क्योंकि हास्केल में यह सिर्फ एक सामान्य पैटर्न है।
तिखन जेल्विस

1
@TikhonJelvis ज़रूर, लेकिन अगर / फिर / साथ / तो आपको एक विशेष फ़ंक्शन की आवश्यकता नहीं है जिसे हमेशा इनलेट होना चाहिए। आपको इनलाइनिंग पास की भी आवश्यकता नहीं है और फिर भी आप सभ्य कोड उत्पन्न कर सकते हैं। सारी दुनिया जीएचसी नहीं है।
इंगो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.