2016-08-14 17 views

Trả lời

11

Against Ven, trong các ý kiến ​​sau đây là câu trả lời Perl 6 cho câu hỏi SO "Có một ngôn ngữ với các loại constrainable?", Đã viết "perl6 doesn't have dependant types" và sau đó đã viết "kiểu phụ thuộc, có lẽ không, ... tốt, nếu chúng tôi nhận được quyết định where s ... "trong trao đổi trên # perl6. (Phản ứng Larry Wall là "what's a few halting problems among friends". Btw, đến nay là cách tốt nhất để có được một câu trả lời có thẩm quyền về tất cả mọi thứ Perl 6 là yêu cầu TimToady qua # Perl6.)

Đối Bản tóm tắt cho 'dependent-type' SO tag là "loại phụ thuộc là các loại phụ thuộc vào giá trị. " Perl 6 hỗ trợ các loại phụ thuộc vào giá trị, do đó, có điều đó.

Đối với Bản tóm tắt chỉnh sửa cho thay đổi của Awwaiid đã thêm Perl 6 vào trang Wikipedia trên Dependent Types nói "Perl 6 ... có loại phụ thuộc không thể xác định".

Trang Wikipedia bắt đầu với:

một loại phụ thuộc là một loại có định nghĩa phụ thuộc vào một giá trị. Một "cặp số nguyên" là một loại. "Một cặp số nguyên trong đó số nguyên thứ hai lớn hơn số nguyên đầu tiên" là một loại phụ thuộc vì sự phụ thuộc vào giá trị.

Dưới đây là một cách để tạo ra một loại cùng những dòng trong Perl 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 

Điều này có nghĩa Perl 6 subset tính năng tạo các loại phụ thuộc? Có lẽ đây là những gì Awwaiid đang nghĩ đến.

+0

Vâng, theo nghĩa là perl 6 có "loại tùy thuộc vào giá trị", sau đó có chắc chắn rồi. Theo định nghĩa này, C cũng vậy. Nhưng chỉ có các loại được lập chỉ mục không phải là rất hữu ích trong chính nó. – Ven

+0

FWIW, [Tôi cũng coi các vai trò tham số không xâm nhập] (https://github.com/vendethiel/6meta-experiments/blob/master/church.pl), nhưng chỉ có phiên bản 'đếm' hoạt động (không tuân theo chúng khi chạy) .Vai trò sẽ cần một giai đoạn "instantiation" (như C++ mẫu) để có được một cái gì đó giống như các loại phụ thuộc, nhưng đó không phải trên menu :-). – Ven

+0

@Ven Có vẻ như định nghĩa phụ thuộc có thể chấp nhận được có thể giống như "các biến vị ngữ gõ đầy đủ hữu ích/tổng hợp thời gian biên dịch đầy đủ hữu ích phụ thuộc vào các giá trị" sao cho vào năm 2017, các loại chỉ mục vanilla không được tính vì chúng không được coi là hữu ích hoặc đủ chung nhưng loại kiểm tra mà làm cho việc sử dụng phù hợp của một người giải quyết SMT. Vì vậy, ngay cả khi P6 là như vậy mà một trình biên dịch có thể phân tích mệnh đề 'where' và biến' where Int | Str | IntStr' loại ràng buộc vào một thời gian biên dịch-loại kiểm tra (có thể nó bao giờ làm điều đó?), Nó vẫn sẽ không được phụ thuộc gõ. Điều đó có gần không? – raiph

11

Có thể cho là có dưới dạng tập con là các loại có thể phụ thuộc vào điều kiện tùy ý. Tuy nhiên, hệ thống kiểu sẽ được phân loại là không xác định là các kiểu bất biến kiểu không được thực thi.

Đặc biệt, loại hạn chế của một biến là chỉ kiểm tra theo sự phân công, vì vậy thay đổi đến một đối tượng mà làm cho nó thả từ một tập hợp con sẽ dẫn đến một biến giữ một đối tượng nó không nên có thể, ví dụ như

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

my OrderedList $list = [1, 2, 3]; 
$list[0] = 42; 
say $list ~~ OrderedList; 

Bạn có thể sử dụng một số thuật sĩ siêu đối tượng để làm cho hệ thống đối tượng tự động kiểm tra loại sau khi bất kỳ cuộc gọi phương thức nào bằng các đối tượng boxing trong các đối tượng bảo vệ trong suốt.

Một thực hiện ngây thơ có thể trông như thế này:

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')); 
} 

Điều này sẽ làm những điều sau thất bại:

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

Tôi đồng ý với tình cảm chung, mặc dù một người đánh máy phụ thuộc vào hardcore (hoặc bất kỳ người ủng hộ nào cho các loại phụ thuộc được gọi) có thể phản đối rằng loại đó không được chọn lúc biên dịch, và vì vậy ví dụ của bạn không được tính. Tôi đoán đó là tất cả để giải thích. – moritz

+0

Điều gì @moritz nói. Thời gian chạy là un (i) đã nhập, do đó, nó cần phải xảy ra tại thời gian biên dịch. – Ven

Các vấn đề liên quan