Levity बहुरूपता क्या है


81

जैसा कि प्रश्न का शीर्षक इंगित करता है, मैं यह जानना चाहता हूं कि लेविस बहुरूपता क्या है और इसकी प्रेरणा क्या है? मुझे पता है कि इस पृष्ठ में कुछ विवरण हैं, लेकिन वहां अधिकांश स्पष्टीकरण मेरे सिर के शीर्ष पर जाते हैं। :)

हालांकि यह पृष्ठ थोड़ा मित्रवत है, फिर भी मैं इसके पीछे की प्रेरणा को नहीं समझ पा रहा हूं।

जवाबों:


81

नोट: यह उत्तर लेविट चर्चाओं पर हाल ही की टिप्पणियों पर आधारित है। Levity बहुरूपता के विषय में सब कुछ वर्तमान में केवल GHC 8.0 रिलीज़ उम्मीदवारों में लागू किया गया है और इस तरह के परिवर्तन के लिए ( उदाहरण के लिए # 11471 देखें )।


टीएल; डीआर : यह लिफ्ट और अनलिफ्टेड प्रकारों पर कार्यों को बहुरूपी बनाने का एक तरीका है, जो नियमित कार्यों के साथ संभव नहीं है। उदाहरण के लिए, निम्नलिखित कोड नियमित बहुरूपताओं के साथ चेक टाइप नहीं करता है, क्योंकि Int#प्रकार है #, लेकिन प्रकार में चर idप्रकार *:

{-# LANGUAGE MagicHash #-}

import GHC.Prim

example :: Int# -> Int# 
example = id            -- does not work, since id :: a -> a
Couldn't match kind ‘*’ with ‘#’
When matching types
  a0 :: *
  Int# :: #
Expected type: Int# -> Int#
  Actual type: a0 -> a0
In the expression: id

ध्यान दें कि (->)अभी भी कुछ जादू का उपयोग करता है।


इससे पहले कि मैं इस सवाल का जवाब देना शुरू करते हैं, हमें एक कदम पीछे लेने के लिए और सबसे अक्सर इस्तेमाल किया कार्यों में से एक के लिए चलते हैं ($)

($)प्रकार क्या है ? खैर, हैकेज और रिपोर्ट के अनुसार, यह है

($) :: (a -> b) -> a -> b

हालाँकि, यह 100% पूर्ण नहीं है। यह एक सुविधाजनक सा झूठ है। समस्या यह है कि बहुरूपी प्रकार (जैसे aऔर b) प्रकार के होते हैं *। हालांकि, (पुस्तकालय) डेवलपर्स ($)न केवल प्रकार के साथ *, बल्कि उन लोगों के लिए भी उपयोग करना चाहते थे #, जैसे

unwrapInt :: Int -> Int#

जबकि Intदयालु है *(यह नीचे हो सकता है), Int#दयालु है #(और बिल्कुल नीचे नहीं हो सकता)। फिर भी, निम्नलिखित कोड टाइप करें:

unwrapInt $ 42

यह काम नहीं करना चाहिए। वापसी प्रकार याद है ($)? यह बहुरूपी था, और बहुरूपी प्रकार दयालु है *, नहीं #! तो यह काम क्यों किया? सबसे पहले, यह एक बग था , और फिर यह एक हैक था ( ghc-dev मेलिंग सूची में रयान स्कॉट द्वारा एक मेल का अंश ):

तो ऐसा क्यों हो रहा है?

लंबा उत्तर यह है कि जीएचसी 8.0 से पहले, टाइप सिग्नेचर में ($) :: (a -> b) -> a -> b, bवास्तव में टाइप में नहीं *, बल्कि था OpenKindOpenKindएक भयावह हैक है जो दोनों (तरह *) को उठाता है और इसे हटाने के लिए अनलिमिटेड (प्रकार #) प्रकार देता है, यही कारण है कि (unwrapInt $ 42) टाइपसेक।

तो ($)जीएचसी 8.0 में नया प्रकार क्या है ? आईटी इस

($) :: forall (w :: Levity) a (b :: TYPE w). (a -> b) -> a -> b
-- will likely change according to Richard E.

इसे समझने के लिए, हमें देखना होगा Levity:

data Levity = Lifted | Unlifted

अब, हम ($)निम्नलिखित में से किसी एक प्रकार के बारे में सोच सकते हैं, क्योंकि केवल दो विकल्प हैं w:

-- pseudo types
($) :: forall a (b :: TYPE   Lifted). (a -> b) -> a -> b
($) :: forall a (b :: TYPE Unlifted). (a -> b) -> a -> b

TYPEएक जादुई स्थिरांक है, और यह प्रकार *और के #रूप में फिर से परिभाषित करता है

type * = TYPE Lifted
type # = TYPE Unlifted

प्रकार पर मात्रा का ठहराव भी काफी नया है और हास्केल में निर्भर प्रकारों के एकीकरण का हिस्सा है ।

नाम Levity polymorphism इस तथ्य से आता है कि अब आप उठा और अनपेक्षित दोनों प्रकारों पर बहुरूपी कार्य लिख सकते हैं, ऐसा कुछ जिसकी अनुमति पिछले बहुरूपता प्रतिबंधों के साथ संभव नहीं थी। साथ ही इससे OpenKindहैक से भी छुटकारा मिलता है । यह वास्तव में "बस" है इस बारे में, दोनों प्रकार के प्रकारों को संभालना।

वैसे, आप अपने प्रश्न के साथ अकेले नहीं हैं। यहां तक ​​कि साइमन पेटन जोन्स ने कहा कि लेविटी विकी पेज की आवश्यकता है , और रिचर्ड ई (इस के वर्तमान कार्यान्वयनकर्ता) ने कहा कि विकी पेज को वर्तमान प्रक्रिया पर एक अपडेट की आवश्यकता है।

संदर्भ


3
"दोनों प्रकार के प्रकारों को संभालना" :)
सिबई

4
हुह। मुझे लगता है कि मैं एक बदसूरत हैक पसंद करूँगा जिसने इस सामान को छिपा कर रखा हो।
jberryman

3
ऐसा क्यों नहीं किया जाता ($) :: forall (w1 w2 :: Levity) (a :: TYPE w1) (b :: TYPE w2). (a -> b) -> a -> bहै, अर्थात ($)गैर-कानूनी तर्कों वाले कार्यों के साथ उपयोग करने योग्य क्यों नहीं माना जाता है?
कैक्टस

3
: @Cactus कि "बग" में चर्चा की है, SPJ से इस टिप्पणी को देख ghc.haskell.org/trac/ghc/ticket/8739#comment:6
जीटा

1
@jberryman: # 11549RuntimeRep ( बदले) को छिपा देगा Levity
ज़ीटा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.