हास्केल: एक सहायक समारोह "गो" नाम देने के लिए सम्मेलन क्यों?


83

goहास्केल सामग्री या स्रोत को पढ़ते समय मैं बहुत कुछ देखता हूं , लेकिन मैं वास्तव में इसके बारे में कभी भी सहज नहीं रहा हूं - (मुझे लगता है कि मेरे दिमाग में "गोटो" का नकारात्मक अर्थ है)। मैं LYAH साथ हास्केल सीखने शुरू कर दिया, और कहा कि जहां मैं का उपयोग करने की प्रवृत्ति उठाया accऔर stepजब सिलवटों लेखन। लेखन के लिए सम्मेलन कहां goसे आता है?

सबसे महत्वपूर्ण बात, वास्तव में नाम goका अर्थ क्या है?


4
मैं आमतौर पर loopइसके बजाय अपने फ़ंक्शन को कॉल करता हूं ।
अगस्त

2
goकिसी भी हास्केल सामग्री में कभी नहीं देखा जो मैंने पढ़ा। क्या आप एक उदाहरण / संदर्भ दे सकते हैं?
इओनु: जी। स्टेन

@ Ionu explanation उदाहरण के लिए, एन्यूमरेटर पैकेज की यसोद पुस्तक की व्याख्या । (क्यों यॉड बुक मैं नहीं जानता कि विषय के लिए इतनी सामग्री समर्पित करता है, लेकिन यह बात बगल में है)
दान बर्टन

इसके लायक होने के लिए, मैंने कई C / C ++ प्रोग्रामर देखे हैं जो अपने सहायक कार्यों को "जाना" नाम देते हैं जब वे बेहतर नाम के बारे में नहीं सोच सकते।
श्रीवत्सआर

Fwiw, स्पष्ट पूंछ प्रत्यावर्तन है कहानियो के लिए क्षमता सहित तरीकों, का एक बहुत में गोटो के कार्यात्मक संस्करण। स्टेटिक टाइपिंग और स्कूपिंग नियम भ्रम को कम से कम रखने में मदद करते हैं, हालांकि। और नाम की पसंद के लिए, मुझे लंबाई और उपयुक्तता के बारे में नीचे @Michael Snoyman का जवाब पसंद है। इसके अलावा, जब सिर्फ एक सहायक कार्य होता है तो इसका नाम काफी हद तक अप्रासंगिक लगता है, इसलिए मैं आमतौर पर या तो 'गो' या 'लूप' चुनता हूं क्योंकि मुझे कुछ चुनना होता है और जो दोनों समझ में आते हैं। मैं आलसी छोरों के लिए 'जाना' और सख्त लोगों के लिए "लूप" पसंद करता हूं।
मोकस

जवाबों:


137

हम्म! कुछ पुरातत्व!

2004 के बाद से मैंने goपूंछ-पुनरावर्ती कार्यकर्ता लूप के लिए सामान्य नाम के रूप में उपयोग किया है , जब एक पुनरावर्ती फ़ंक्शन के कार्यकर्ता / आवरण परिवर्तन करते हैं। मैंने इसे व्यापक रूप से उपयोग करना शुरू कर दिया bytestring, जैसे

foldr :: (Word8 -> a -> a) -> a -> ByteString -> a
foldr k v (PS x s l) = inlinePerformIO $ withForeignPtr x $ \ptr ->
        go v (ptr `plusPtr` (s+l-1)) (ptr `plusPtr` (s-1))
    where
        STRICT3(go)
        go z p q | p == q    = return z
                 | otherwise = do c  <- peek p
                                  go (c `k` z) (p `plusPtr` (-1)) q -- tail recursive
{-# INLINE foldr #-}

bytestringअगस्त 2005 से था ।

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

जीएचसी स्रोतों से

मुहावरे हालांकि आगे वापस लौट जाते हैं। foldrGHC.Base में दिया गया है:

foldr k z = go
      where
         go []     = z
         go (y:ys) = y `k` go ys

जो शायद मैं कहाँ चाल उठाया है (मुझे लगता है कि यह एंडी गिल की थीसिस से था, लेकिन goवहां कोई उपयोग नहीं मिल सकता है )। इसे गोफर में इस रूप में नहीं दिया गया है, इसलिए मुझे लगता है कि यह पहली बार GHC कोड बेस में दिखाई दिया।

2001 तक, साइमन मार्लो goकुछ सिस्टम-स्तरीय कोड का उपयोग कर रहा था , इसलिए हम दोष को जीएचसी में कहीं रख सकते हैं, और यह सुराग हमें जीएचसी स्रोत तक ले जाता है , जहां goकार्यकर्ता कार्यों में व्यापक रूप से उपयोग किया जाता है:

myCollectBinders expr
  = go [] expr
  where
    go bs (Lam b e)          = go (b:bs) e
    go bs e@(Note (SCC _) _) = (reverse bs, e)
    go bs (Cast e _)         = go bs e
    go bs (Note _ e)         = go bs e
    go bs e                  = (reverse bs, e)

जीएचसी 3.02 और ग्लासगो

जीएचसी के पुराने संस्करणों को खोदते हुए, हम देखते हैं कि जीएचसी 0.29 में यह मुहावरा नहीं दिखता है, लेकिन जीएचसी 3.02 श्रृंखला (1998) द्वारा, goमुहावरा हर जगह दिखाई देता है। 1996-1997 Numeric.lhsकी परिभाषा में , एक उदाहरण,showInt

showInt n r
  | n < 0     = error "Numeric.showInt: can't show negative numbers"
  | otherwise = go n r
    where
     go n r =
      case quotRem n 10 of                 { (n', d) ->
      case chr (ord_0 + fromIntegral d) of { C# c# -> -- stricter than necessary
      let
    r' = C# c# : r
      in
      if n' == 0 then r' else go n' r'
      }}

यह H98 रिपोर्ट में दिए गए एक अलग कार्यान्वयन है । के कार्यान्वयन में खुदाई "Numeric.lhs" , तथापि, हम पाते हैं कि यह संस्करण है कि 1997 में GHC 2.06 में जोड़ा गया था के रूप में ही नहीं है, और Sigbjorne Finne से एक बहुत ही दिलचस्प पैच प्रकट होता है, अप्रैल 1998 में, एक जोड़ने goन्यूमेरिक को लूप।

यह कहा गया है कि 1998 तक कम से कम, Sigbjorne जोड़ने था goGHC के छोरों "एसटीडी" पुस्तकालय, जबकि एक साथ, कई GHC संकलक कोर में मॉड्यूल था goछोरों। आगे की खुदाई करते हुए, जुलाई 1996 में विल पार्टेन की यह बहुत ही दिलचस्प प्रतिबद्धता जीएचसी में एक "गो" लूप जोड़ती है - हालांकि कोड साइमन जेजे से आता है!

इसलिए मैं इसे ग्लासगो में लोगों द्वारा आविष्कृत ग्लासगो मुहावरे के रूप में बुलाने जा रहा हूं , जो 90 के दशक के मध्य में सिमोन मार्लो , सिगबॉर्न फिन , विल पार्टन और साइमन पेटन जोन्स जैसे जीएचसी पर काम करते थे ।


4
+1 के लिए "पूंछ-पुनरावर्ती कार्यकर्ता लूप के लिए सामान्य नाम" जो आमतौर पर मेरे द्वारा देखे जाने वाले अधिकांश उपयोगों के लिए सही प्रतीत होता है। किसी फ़ंक्शन के लिए f, मैं व्यक्तिगत f'रूप से इस तरह की चीज़ के लिए नाम के रूप में आमतौर पर उपयोग करूंगा , हालांकि goपास-कीवर्ड मुहावरे के एक प्रकार के रूप में उपयोग करना कुछ ऐसा है जिसे मैं लेने की कोशिश कर सकता हूं। ध्यान दें कि showIntएक ही गार्ड का कई बार आकलन करने से बचने के लिए मुहावरे का उपयोग करता है।
डैन बर्टन

1
BTW के लिए, "वास्तव में नाम का अर्थ क्या माना जाता है?" मैं कहूंगा कि यह संकेत देता है goto, और एक सहायक फ़ंक्शन को नियंत्रण सौंपने पर।
डॉन स्टीवर्ट

25
मेरा अस्पष्ट स्मरण है कि यह एक साइमन PJ-ism है। मैं का उपयोग करते हैं loop, जब तक कि मैं कोड का उपयोग करता है कि पहले से ही संशोधित कर रहा हूँ goसम्मेलन। मैंने हमेशा सोचा था कि इसका शाब्दिक अर्थ "गो" है, जैसा कि "लूप के चारों ओर जाना" है।
साइमन मार्लो

5
मैंने हमेशा अपने गंदे पुनरावर्ती श्रम को शुरू करने के लिए कार्यकर्ता के आदेश के रूप में "जाना" के बारे में सोचा। किसी भी मामले में, व्यक्तिगत रूप से, मैंने इसे स्ट्रीम फ्यूजन स्लाइड्स में से एक से उठाया क्योंकि फ़ंक्शन नाम में टिक जोड़ने से हमेशा यह समस्या होती थी कि मैं टिक को भूल जाऊंगा।
हेनरिक एपेल्मस

4
मेरा मानना ​​है कि इसकी उत्पत्ति हास्केल से पहले हुई है। गो, स्कीम के नाम से जाने जाने का एक लोकप्रिय नाम है ( google.com/… , google.com/search?q=scheme+%22let+go%22+-let's+car+cdr )
AtnNn

17

जाहिर है डॉन का जवाब सही है। मुझे केवल एक छोटे से विवरण में जोड़ना है (क्योंकि यह मेरा लेखन है कि आप सीधे उल्लेख कर रहे हैं) लगता है: जाना अच्छा है क्योंकि यह केवल दो अक्षर हैं।

ओह, और यसुद पुस्तक इतनी सामग्री को एन्यूमरेटर पैकेज के लिए समर्पित करती है, क्योंकि मैंने पहले से ही एन्यूमरेटर के तीन-भाग ट्यूटोरियल को एक ब्लॉग पोस्ट श्रृंखला के रूप में लिखा है, इसलिए मैंने निर्णय लिया कि मैं इसे पुस्तक में शामिल कर सकता हूं। यमदूत पैकेज का उपयोग यसोद भर में कई स्थानों पर किया जाता है, इसलिए यह प्रासंगिक है।


6
+1 "गो" केवल 2 अक्षर (और अभी भी सार्थक) होने के कारण एक ऐसा तथ्य है, जिसकी सराहना करना आसान है। जब मैंने यसोद पुस्तक के "गो" के उपयोग के बारे में टिप्पणी की (जो उन उदाहरणों के लिए एक उत्कृष्ट नाम विकल्प था, इम्हो), मैं वास्तव में एक स्टैकऑवरफ्लो उत्तर पढ़ रहा था जो "गो" का उपयोग करता था जब मुझे लगा कि मुझे प्रश्न पूछना चाहिए। मुझे तुरंत यसोद पुस्तक का उदाहरण याद आया, हालांकि, यह यादगार था। अच्छी चीज़!
दान बर्टन

11

मुझे उम्मीद है कि इस मुहावरे को न केवल रैखिक संरचनाओं (और इसलिए "लूप्स") पर लागू किया जाएगा, बल्कि ब्रांचिंग (पेड़ जैसी) संरचनाओं के लिए भी।

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


मुझे लगता है कि यह उल्लेख है कि अक्सर इन कार्यों के लिए अच्छे नामों के साथ आना मुश्किल होता है क्योंकि वे आमतौर पर एक परिक्षेत्र के दायरे में चर का उल्लेख करते हैं और इसलिए वास्तव में पूर्ण नहीं होते हैं। एक वर्णनात्मक नाम संभवतः मूर्खतापूर्ण लगेगा: कुछ ऐसा add_xया consOnto_xs
dfeuer
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.