2016-08-14 38 views
12

मैं हाल ही में wikipedia page for dependent types देख रहा था, और मैं सोच रहा था; क्या पर्ल 6 वास्तव में निर्भर प्रकारों को पेश करता है? मुझे लगता है कि एक विश्वसनीय स्रोत का दावा नहीं कर रहा है।क्या पर्ल 6 निर्भर प्रकारों का समर्थन करता है?

यह कुछ के लिए स्पष्ट हो सकता है, लेकिन यह सुनिश्चित है कि बिल्ली मेरे लिए स्पष्ट नहीं है।

उत्तर

11

खिलाफ Ven, तो सवाल यह करने के लिए पर्ल 6 जवाब निम्नलिखित टिप्पणी में "वहाँ constrainable प्रकार के साथ एक भाषा है?", "perl6 doesn't have dependant types" लिखा था और बाद में लिखा "निर्भर प्रकार, शायद नहीं ... ठीक है, अगर हम अनुमानित where एस ... "# perl6 पर एक एक्सचेंज में मिलता है। (लैरी वॉल की प्रतिक्रिया "what's a few halting problems among friends" था। Btw, अब तक का सबसे अच्छा तरीका ये सभी काम पर्ल 6 # perl6 के माध्यम से TimToady पूछना है पर एक आधिकारिक जवाब मिलता है।)

लिए 'dependent-type' SO tag के लिए सारांश "है आश्रित प्रकार के होते हैं प्रकार जो मूल्यों पर निर्भर करते हैं। " पर्ल 6 उन मानों का समर्थन करता है जो मानों पर निर्भर करते हैं, इसलिए वह है।

के लिए कि पर्ल 6 Dependent Types पर विकिपीडिया के पृष्ठ पर जोड़ा Awwaiid से बदलाव के लिए संपादन सारांश कहते हैं, "पर्ल 6 ... अनिर्णनीय निर्भर प्रकार है।"

एक आश्रित प्रकार एक प्रकार जिसकी परिभाषा एक मूल्य पर निर्भर करता है: के साथ

विकिपीडिया पृष्ठ शुरू होता है। ए "पूर्णांक की जोड़ी" एक प्रकार है। ए "पूर्णांक की जोड़ी जहां दूसरा पहले से अधिक है" मूल्य पर निर्भरता के कारण एक निर्भर प्रकार है।

subset LessMorePair of Pair where { $_.key < $_.value } 
subset MoreLessPair of Pair where { $_.key > $_.value } 

multi sub foo (  Pair) { " P" } 
multi sub foo (LessMorePair) { "LMP" } 
multi sub foo (MoreLessPair) { "MLP" } 

for 1 => 1, 1 => 2, 2 => 1 { say foo $_ } 

# P 
# LMP 
# MLP 

इसका मतलब यह है पर्ल 6 subset सुविधा निर्भर प्रकार उत्पन्न करता है:

यहाँ एक ही रास्ता पर्ल 6 में उन पंक्तियों के साथ एक प्रकार बनाने के लिए है? शायद यही वह है जो अय्यईद सोच रहा है।

+0

ठीक है, कि पर्ल अर्थों में 6 है "मूल्यों के आधार पर प्रकार", तो हाँ ज़रूर। इस परिभाषा से, सी भी करता है। लेकिन केवल अनुक्रमित प्रकार होने के कारण ही बहुत उपयोगी नहीं है। – Ven

+0

एफडब्ल्यूआईडब्लू, [मैंने पैरामीटरकृत भूमिकाओं को अपहृत करने पर भी विचार किया] (https://github.com/vendethiel/6meta-experiments/blob/master/church.pl), लेकिन केवल 'गिनती' संस्करण काम करता है (जो उन्हें रनटाइम पर छोड़ देता है) ।भूमिकाओं को निर्भर प्रकारों के समान कुछ पाने के लिए "तत्काल" चरण (जैसे सी ++ टेम्पलेट्स) की आवश्यकता होगी, लेकिन यह मेनू पर नहीं है :-)। – Ven

+0

@ वेन यह निर्भर टाइपिंग की स्वीकार्य परिभाषा की तरह लगता है जैसे "पर्याप्त उपयोगी/सामान्य संकलन-समय पूरी तरह से निर्णायक टाइपशेकिंग भविष्यवाणी करता है जो मानों पर निर्भर करता है" ताकि 2017 में, वेनिला अनुक्रमित प्रकारों की गणना न हो क्योंकि वे उपयोगी या सामान्य नहीं माना जाता है लेकिन टाइपिंग जांच जो एक एसएमटी सॉल्वर के उपयुक्त उपयोग करता है। तो अगर पी 6 ऐसा था कि एक कंपाइलर 'कहां' खंडों का विश्लेषण कर सकता है और 'जहां Int | स्ट्र | IntStr' प्रकार संकलन-समय प्रकार-जांच में बाधा है (क्या यह कभी ऐसा कर सकता है?), यह अभी भी निर्भर टाइपिंग नहीं होगा। क्या वह करीब है? – raiph

11

तर्कसंगत रूप से हाँ सबसेट्स प्रकार हैं जो मनमाने ढंग से स्थितियों पर निर्भर हो सकते हैं। हालांकि, टाइप सिस्टम को अबाधित के रूप में वर्गीकृत किया जाएगा क्योंकि टाइप इनवेरिएंट लागू नहीं किए जाते हैं।

विशेष रूप से, एक चर के प्रकार बाधा केवल, जैसे

subset OrderedList of List where [<=] @$_; 

my OrderedList $list = [1, 2, 3]; 
$list[0] = 42; 
say $list ~~ OrderedList; 
काम पर चेक किया जाता है, तो एक वस्तु है कि यह एक सबसेट से ड्रॉप एक वस्तु धारण एक चर के लिए नेतृत्व करेंगे बनाने के लिए संशोधन यह करने के लिए सक्षम नहीं होना चाहिए

आप पारदर्शी गार्ड ऑब्जेक्ट्स में बॉक्सिंग ऑब्जेक्ट्स द्वारा किसी भी विधि कॉल के बाद ऑब्जेक्ट सिस्टम को स्वचालित रूप से प्रकार की जांच करने के लिए कुछ मेटा-ऑब्जेक्ट विज़ार्ड्री का उपयोग कर सकते हैं।

एक अनुभवहीन क्रियान्वयन ऐसा दिखाई दे सकता है:

class GuardHOW { 
    has $.obj; 
    has $.guard; 
    has %!cache = 
     gist => sub (Mu \this) { 
      this.DEFINITE 
       ?? $!obj.gist 
       !! "({ self.name(this) })"; 
     }, 
     UNBOX => sub (Mu $) { $!obj }; 

    method find_method(Mu $, $name) { 
     %!cache{$name} //= sub (Mu $, |args) { 
      POST $!obj ~~ $!guard; 
      $!obj."$name"(|args); 
     } 
    } 

    method name(Mu $) { "Guard[{ $!obj.^name }]" } 
    method type_check(Mu $, $type) { $!obj ~~ $type } 
} 

sub guard($obj, $guard) { 
    use nqp; 
    PRE $obj ~~ $guard; 
    nqp::create(nqp::newtype(GuardHOW.new(:$obj, :$guard), 'P6int')); 
} 

यह निम्न कर देगा असफल:

my $guarded-list = guard([1, 2, 3], OrderedList); 
$guarded-list[0] = 42; 
+1

मैं सामान्य भावना से सहमत हूं, हालांकि एक कट्टर निर्भर टाइपिस्ट (या जो भी निर्भर प्रकारों के लिए वकालत करता है) ऑब्जेक्ट कर सकता है कि प्रकार संकलित समय पर चेक नहीं किया गया है, और इसलिए आपका उदाहरण गिनता नहीं है। मुझे लगता है कि यह सब व्याख्या करने के लिए है। – moritz

+0

क्या @moritz ने कहा। रनटाइम अन (i) टाइप किया गया है, इसलिए इसे संकलन-समय पर होने की आवश्यकता है। – Ven

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