2016-10-11 6 views
6

हाल ही में मैंने हाल ही में "उठाए गए उत्पाद प्रकार" शब्द को पार किया, जैसा कि एक अनलिमिटेड के विपरीत है।हास्केल में उठाए गए और बिना उत्पादित उत्पाद प्रकार क्या हैं?

मुझे संदर्भ याद नहीं है, लेकिन मुझे लगता है कि स्टैक ओवरफ़्लो पर अनचाहे उत्पाद प्रकारों (example) के नुकसान के बारे में पूछे जाने वाले अन्य प्रश्न हैं।

मैं जानता हूँ कि कम या ज्यादा एक उत्पाद का प्रकार क्या है। यह (a, b) या Foo a b c जैसा कुछ है जो मोटे तौर पर सेट सिद्धांत से कार्टेशियन उत्पाद से मेल खाता है।

कौन-से शब्द "उठा लिया" और "unlifted" इस संदर्भ में क्या मतलब है?

+0

संबंधित प्रश्न: https://stackoverflow.com/questions/27095011/what-exactly-is-the-kind-in-haskell – danidiaz

उत्तर

6
GHC docs से

:

"उठाया" प्रकार का मतलब है कि प्रकार के मामले नीचे हो सकता है।

"बॉक्सिंग" प्रकार का मतलब है कि एक मूल्य के एक ढेर वस्तु के लिए एक सूचक का प्रतिनिधित्व करती है।

कुछ निहितार्थ में शामिल हैं:

  • एक उठाया प्रकार बॉक्सिंग जाता है (लेकिन जरूरी नहीं कि दूसरी तरह - अधिक के लिए ऊपर दिए गए लिंक की जाँच)
  • अनबॉक्स्ड प्रकार Thunks नहीं हो सकता (चूँकि उनका संकेत दिए गए हैं आंकड़ों के बारे में बताते हुए कि मूल्य का उत्पादन कैसे करें), इसलिए कोई आलस्य नहीं है। वे वास्तव में मूल्यों को पकड़ते हैं। इसका मतलब यह भी है कि वे तेज़ हो सकते हैं।
  • पॉलिमॉर्फिज्म अनलिमिटेड प्रकारों के साथ नहीं खेलता है। जब भी आप एक प्रकार परिवर्तनीय देखते हैं, तो शामिल सभी प्रकार अनलिमिटेड होते हैं। id 0 :: Int# की तरह कुछ काम नहीं करता है। this answer देखें कि आप कैसे देख सकते हैं (जीएचसी 8.0 के बाद से) कभी-कभी इस पर घूमते हैं।

ध्यान दें कि आप MagicHash और UnboxedTuples एक्सटेंशन का उपयोग (हालांकि मुझे नहीं लगता कि वे अच्छी तरह से GHCi के साथ खेलते हैं) GHC में unlifted उत्पादों बना सकते हैं:

{-# LANGUAGE MagicHash, UnboxedTuples #-} 

extGCD :: Int -> Int -> (# Int, Int, Int #) 
extGCD a 0 = (# 1, 0, a #) 
extGCD a b = let (q, r) = a `quotRem` b 
       (# s, t, g #) = extGCD b r 
      in (# t, s - q * t, abs g #) 
इस विस्तार के अपवाद के साथ

, मेरा मानना ​​है कि आप पाएंगे कि केवल अनलिमिटेड प्रकार GHC.Exts में हैं और वे प्राचीन प्रकार हैं। कस्टम अनलिफ्ट किए गए डेटा प्रकारों को जीएचसी here में एकीकृत करने की अनुमति देने के लिए कुछ चर्चा है।

एक अंतिम टिप्पणी: जबकि उठाए गए प्रकारों की तरह * है, बिना प्रकार के प्रकार # हैं। टिप्पणियों में जुड़े प्रश्न के लिए This answer इस बारे में अधिक जानकारी में जाता है।

+0

"पॉलिमॉर्फिज्म अनलिफ्ट प्रकारों के साथ नहीं खेलता है": bzzzt। पॉलीमोर्फिज्म * अनबॉक्स किए गए * प्रकारों के साथ नहीं खेलता है। पॉलिमॉर्फिज्म अनलिमिटेड प्रकारों के साथ ठीक काम करता है, उदाहरण के लिए, एमएल में (हालांकि हास्केल की तरह की प्रणाली इसे समर्थन देने के लिए पर्याप्त लचीली नहीं हो सकती है)। –

+0

@jcast पर्याप्त सच है - मेरा मतलब है हास्केल की तरह की प्रणाली के संदर्भ में टिप्पणी जहां टाइप वैरिएबल के पास अन्यथा निर्दिष्ट होने तक दयालु '*' है। वास्तव में यह लिंक दिखाता है कि जीएचसी 8.0 की नई लेविटी पॉलिमॉर्फिज्म सुविधाओं के साथ इस प्रतिबंध को कैसे हटाया जा सकता है। क्या यह स्पष्ट करता है? – Alec

5

GHC documentation से:

Lifted 

A type is lifted iff it has bottom as an element. 

एक उठाया प्रकार का मान bottom हो सकता है। यही है, यह undefined हो सकता है, या शायद एक गणना जो कभी खत्म नहीं होती है, या जो अपवाद फेंकता है।

इस बीच, unlifted प्रकार उन संभावित परेशानी अतिरिक्त मूल्यों की जरूरत नहीं है। यह पूरी तरह से "अर्थपूर्ण" स्तर में उपयोगी हो सकता है (यदि आप उन अतिरिक्त मूल्यों को नहीं चाहते हैं) और यह महंगा संकेतों को कम करके अधिक कुशल कार्यान्वयन की सुविधा भी दे सकता है। the worker-wrapper transformation नामक एक जीएचसी ऑप्टिमाइज़ेशन इसका फायदा उठाता है (लिंक किए गए पेपर की धारा 5.1 देखें)।

उठा लिया और unlifted प्रकार विभिन्न प्रकार की है। लिफ्ट किए गए प्रकार * में रहते हैं, # में अनलिमिटेड प्रकार।

वर्तमान में GHC आप आसानी से अपने खुद जटिल unlifted डेटाटाइप्स को परिभाषित नहीं देता। लेकिन इसके लिए अनुमति देने के लिए proposals हैं।

संबंधित मुद्दे