Hướng dẫn what is dependent type programming in python? - lập trình kiểu phụ thuộc trong python là gì?

Yes, but it's super hacky (and it would be really hard to get everything right). First, you would need to modify the object's type when a change is made to the object.

From the docs:

"An object’s type determines the operations that the object supports (e.g., “does it have a length?”) and also defines the possible values for objects of that type. The type() function returns an object’s type (which is an object itself). Like its identity, an object’s type is also unchangeable. [1]"

But in the footnote for [1]:

"[1] It is possible in some cases to change an object’s type, under certain controlled conditions. It generally isn’t a good idea though, since it can lead to some very strange behaviour if it is handled incorrectly."

To change an object's type, you need to set the object's __class__ attribute to a different class. Here's a simple example with two value-dependent types of integers:

class Integer:                                                                           
    def __init__(self, value):                                                           
        self.value = int(value)                                                          
        self.set_class()                                                                 

    def set_class(self):                                                                 
        if self.value < 10:                                                              
            self.__class__ = LessThanTen                                                 
        else:                                                                            
            self.__class__ = TenOrMore                                                   

    def add(self, value):                                                                
        self.value += int(value)                                                         
        self.set_class()                                                                 

class TenOrMore(Integer):                                                                
    def __init__(self):                                                                  
        pass                                                                             
        raise ValueError("Use Integer()")                                                

class LessThanTen(Integer):                                                              
    def __init__(self):                                                                  
        raise ValueError("Use Integer()")

You can then do standard operations on them and have them change according to their new value:

>>> from dependent import Integer, TenOrMore, LessThanTen
>>> a = Integer(5)
>>> print(a.value, type(a))
5 
>>> a.add(10)
>>> print(a.value, type(a))
15 

This approach requires hard-coding classes in advance. It would be possible to generate classes dynamically, though it would require some generating gymnastics to ensure everything lived in the same scope (such as a top-level dictionary and class generator function). However, I don't think the current type hinting system would support such dynamically-generated classes.

Hướng dẫn what is dependent type programming in python? - lập trình kiểu phụ thuộc trong python là gì?

A Gentle Introduction to Dependent Types

Dependent type (or dependently typed programming) languages allow to enhance the expressiveness of your code, thereby increasing the errors the compiler can catch (at compile time). This allows you to correct them and improve the chances that your program behaves as expected at runtime. It makes them particularly well suited to write smart contracts. For feedback or questions, please do not hesitate to contact us:

Computers and software are part of our daily life. They are everywhere and we rely on them daily, for instance for financial transactions, communication or even home appliances [1]. Bugs and errors seem commonly accepted [1], although they can sometimes have catastrophic consequences. For that reason, several solutions exist in order to detect and reduce them, the most prominent one being type systems [2]. The primary goal of a type system is to prevent the manifestation of execution errors by executing a type checking algorithm in order to catch type errors [3] [4]. In computer science, type systems have been introduced in the 1950’s (in programming languages like Fortran) [2].
Nowadays, not all languages use a type system. As a result, programming languages can be classified into two categories: statically or dynamically typed1 (also known as untyped [4]). Statically typed languages (like Java, C, C++, Fortran, etc.) perform a type checking operation during the compilation process, and stop compilation if the type checker encounters an error [4]. For instance, adding a string to a variable defined as an integer will cause an error. In dynamically typed languages (like Python, JavaScript, etc. [5]), however, this error may only reveal itself when the program is being executed. This can be perceived as an additional difficulty to programmers, as they will not receive any assistance "to understand what the code actually does" [4].

It follows that statically typed languages add a safeguard against potential execution errors compared to dynamically type languages [3]. This extra safeguard will increase compilation time ("as compilation becomes more expensive" [4]) as well as potentially the complexity of the code [4]. Thus, dynamically typed languages can be perceived as more permissible and grant more power to the programmer [4]. It is a double-edged sword, as bugs reveal themselves at runtime and are generally fatal for the execution of the software [4]. In order to circumvent some of them, programmers using dynamically typed languages can employ a linter (somehow comparable to a type system, as a linter will analyse the code to detect programming and stylistic errors [6]).
Type systems undeniably confirm the "absence of some bad program behaviour", however, they cannot "prove their presence" [2]. In other words, they might reject some programs that would work properly at runtime [2]. For instance, consider the following line of code:

if(true)
return 5;
else
return "Hello";

will be rejected as ill-typed2 even though the else clause will never be reached [2]. Type checking could be compared to dimensional analysis used in physics3, where the analysis of base units of an equation provides a "partial correctness check" [7]. For instance, if we express the distance as the multiplication of speed and weight we end up with an incoherent result (distance expressed as m ⋅ kg/s)4. $$distance [m] = speed [m/s] \cdot weight [kg] \rightarrow [m] \neq \left[\frac{m \cdot kg}{s}\right]$$ In contrast, Einstein’s famous formula is correct at least from a dimension analysis point of view: $$E = mc^2 \rightarrow \left[\frac{kg \cdot m^2}{s^2}\right] = [kg] \cdot [m/s]^2$$ An equation can pass dimensional analysis but will still be meaningless. In the same way, type systems can only ensure that a well-typed software is free from certain errors. Nevertheless, they can reveal a wide range of errors [2] to such an extent that once the code of a richly typed languages compiles, it usually "just works" [2]. Thus, it appears that the more richly typed your programming language is, the more errors the compiler will catch [4], increasing the chance that your program behaves as expected. Unfortunately, mainstream statically typed systems only offer a few basic types (e.g. integers, string, boolean, etc.), which limits the expressiveness of the code. Although depending on the use case those basic types offered are more than enough, there are certain use cases where it is insufficient. Therefore, the best solution would be to offer a programming language that allows the programmer to extend the expressiveness of types according to their needs, and capture more advanced properties if needed. This could be done by using dependently typed languages which we will cover in the following section.

Các loại phụ thuộc

Tổng quan

Thông thường, các loại và thuật ngữ nằm ở một cấp độ khác, thuật ngữ được sử dụng xác định loại nào có thể được gán cho nó [8]. Chẳng hạn, giá trị 1 sẽ phải được lưu trữ trong một biến của loại Int5. Bây giờ, nếu chúng ta đặt báo giá xung quanh nó, tức là, 1 1, nó ngay lập tức trở thành một loại char hoặc chuỗi (bạn không thể gán nó một loại int nữa). Với các loại phụ thuộc, sự phân tách giữa các loại và thuật ngữ bị mờ [9], giờ đây chúng ngồi cùng cấp độ. Do đó, các loại phụ thuộc cho phép các loại phụ thuộc vào một loại loại khác [10] [11]. Do đó, bất kỳ phần nào của chương trình có thể được đánh giá theo giá trị cũng có thể được đánh giá thành loại6 [4]. Một ví dụ điển hình là một mảng có độ dài cố định. Chẳng hạn, một mảng có độ dài ba là mảng loại và kích thước của nó phụ thuộc vào giá trị được truyền (trong trường hợp này là ba). Bằng cách sử dụng các giá trị khác nhau, bạn xác định các loại đặc biệt. Điều này cho phép lần lượt chỉ định một hàm chỉ có thể nhận một loại nhất định làm đầu vào. Chẳng hạn, nếu bạn chỉ định là đầu vào của hàm của mình, một mảng có kích thước ba và cung cấp một mảng có kích thước bốn, trình biên dịch sẽ bắt lỗi này. Các ngôn ngữ khác cũng cho phép bạn tạo một mảng có kích thước cố định, tuy nhiên, với loại phụ thuộc thực sự, kích thước của mảng của bạn có thể là một thuật ngữ tùy ý không cần "được biết đến tại thời điểm biên dịch" [9].

Do đó, với một ngôn ngữ được đánh máy phụ thuộc, nhà phát triển có tùy chọn thêm tính biểu cảm vào mã của họ bằng cách mở rộng tính biểu cảm của các loại [12] và do đó trình biên dịch có thể bắt được nhiều lỗi hơn [4]. Tùy thuộc vào lập trình viên để quyết định mức độ chi tiết nào họ muốn đi (hoặc thậm chí không sử dụng chúng). Các loại phụ thuộc được sử dụng càng phức tạp, lập trình viên sẽ phải dành nhiều thời gian để mô tả chính xác chúng và nó sẽ tốn kém hơn [4], nhưng đổi lại, họ sẽ nhận được nhiều hỗ trợ hơn từ trình biên dịch [8]. Do đó, bằng cách trao quyền cho nhà phát triển rõ ràng hơn trong mã của họ, nó làm tăng lượng lỗi tiềm năng mà trình biên dịch có thể bắt [13] [14] [15]. Tùy thuộc vào vấn đề trong tay, đó là chi phí thanh toán tương đối khiêm tốn [16]. Hơn nữa, vì tùy thuộc vào lập trình viên để xác định mức độ phức tạp của mã của họ, họ có thể chọn mức độ biểu cảm phù hợp để tối đa hóa lợi ích ròng [17].

Các chương trình là bằng chứng

Sự phát triển của các ngôn ngữ lập trình phụ thuộc loại có nguồn gốc từ thư từ Curry-Howard [11]. Về cơ bản, nó phác thảo một sự tương ứng giữa toán học (logic trực giác) và ngôn ngữ lập trình (lý thuyết loại) [18]. Nó có được tên của nó từ thực tế là lần đầu tiên nó được quan sát bởi Haskell Curry (vào năm 1934 [19]) và sau đó được William Alvin Howard tinh chỉnh (năm 1969 [20]) [21]. Vào đầu những năm 1930, Curry đã nhận ra sự giống nhau giữa các tiên đề của phép tính mệnh đề ngụ ý p ⊃ p (p ⊃ q ⊃ r) (p ⊃ q) và k) [11] A → B → A (A → B → C) → (A → B) → A → C Các điểm tương đồng khác bắt đầu được phát hiện dẫn đến sự tương ứng của Curry-Howard. Sự tương ứng của Curry-Howard nêu ở cấp độ cao mà mỗi đề xuất logic trực giác có thể được chuyển đổi thành một loại trong ngôn ngữ lập trình và ngược lại [21]. Kết quả là:P ⊃ Q ⊃ P (P ⊃ Q ⊃ R) ⊃ (P ⊃ Q) ⊃ P ⊃ R and types of SKI combinator calculus (in particular combinators S and K) [11] A → B → A (A → B → C) → (A → B) → A → C Other similarities started to be discovered which resulted in the Curry-Howard correspondence. The Curry-Howard correspondence states on a high level that each proposition of intuitionistic logic can be converted into a type in the programming language and vice versa [21]. It results that:

Các loại là đề xuất

Nó đi xa hơn, như đối với mỗi đề xuất có thể chứng minh tồn tại một chương trình với một loại tương ứng và ngược lại [21]. Do đó:

Các chương trình là bằng chứng

Do đó, có thể chứng minh một định lý toán học bằng máy tính (được gọi là bằng chứng hỗ trợ máy tính). Một ví dụ khét tiếng là bằng chứng của bốn định lý màu [22]. Do đó, bằng cách sử dụng các loại phụ thuộc để mã hóa các đề xuất dưới dạng các loại, chương trình kết quả có thể được sử dụng làm bằng chứng. Vì trình biên dịch sẽ gõ kiểm tra chương trình, nó chỉ cần biên dịch để được chứng minh là đúng [18]. Theo một cách nào đó, bằng cách kiểm tra chương trình của bạn, trình biên dịch sẽ chứng minh rằng chương trình của bạn xác minh các định lý nhất định [22]. Do đó, các chương trình được gõ phụ thuộc về bản chất là "mã mang bằng chứng" [17].

Ngôn ngữ lập trình được gõ phụ thuộc

Thật không may, các loại phụ thuộc không được các lập trình viên biết đến [23]. Các ngôn ngữ được đánh máy tĩnh chính thống không hỗ trợ chúng [14]. Hơn nữa, một phần lớn của tài liệu về các loại phụ thuộc được viết bởi các học giả để các học giả khác đọc [23]. Do đó, chúng thường là trừu tượng. Tồi tệ hơn, các lập trình viên biết về chúng thường miễn cưỡng sử dụng các ngôn ngữ lập trình được đánh máy phụ thuộc vì người ta tin rằng kiểm tra loại trở nên không thể quyết đoán được (nghĩa là bằng cách cho phép biểu thức tùy ý theo loại, trình kiểm tra loại sẽ lặp lại vô tận) [23] [24]. Có vẻ như rào cản chính làm chậm sự lan truyền của các loại phụ thuộc có liên quan đến sự hiểu lầm [23]. Điều này cùng với thực tế là không có nhiều trình biên dịch hiệu suất cao có sẵn khiến họ không được công chúng biết đến nhiều.

Vì nó thường như vậy, cách tốt nhất để học một cái gì đó là bắt đầu chơi với nó. Mặc dù gần đây, có nhiều ngôn ngữ loại phụ thuộc khác nhau, trong đó nổi bật nhất là: Coq (2004 [25]), Agda (2007 [8]), Idris (2011 [26]), F* (2011 [27]) . Có một số tài nguyên rất tốt để bắt đầu học chúng (đối với Idris, hãy xem F.I. [1] hoặc [28]). Haskell là một ngôn ngữ lập trình khác có thể được sử dụng để thử nghiệm các loại phụ thuộc. Hơn nữa, một số người lập luận rằng bằng cách học Haskell, nó giúp bạn phát triển như một lập trình viên và theo một nghĩa nào đó làm cho bạn trở thành một lập trình viên tốt hơn [29] [30]. Do đó, thời gian bạn dành để học nó (ngay cả khi bạn không sử dụng nó sau đó) sẽ có giá trị. Hơn nữa, các lập trình viên Haskell mới bắt đầu trải nghiệm một hiện tượng tò mò: một khi mã của bạn biên dịch, nó thường chỉ hoạt động. Đó là một sự kiện định kỳ đến mức Wiki Haskell có một trang cho nó: tại sao Haskell chỉ hoạt động.

Nếu có rất nhiều lợi thế, tại sao các ngôn ngữ được gõ phụ thuộc không phổ biến hơn? Trên thực tế, không có nhiều dự án và công ty sử dụng các ngôn ngữ được gõ phụ thuộc. Điều này có thể là do một số lý do:

  • Việc áp dụng thương mại của các ngôn ngữ đó có thể bị suy yếu vì chúng khá gần đây, bị hiểu lầm và được coi là khó học. Do đó, điều này làm giảm mức độ kinh nghiệm của các lập trình viên và bộ kỹ năng có sẵn tiềm năng của công nhân. Điều này đến lượt nó làm giảm số lượng dự án tiềm năng có thể được hưởng lợi từ nó. Ngoài ra, các tài nguyên có thể được sử dụng bởi khán giả nói chung khá khan hiếm vào lúc này.

  • AGDA và CoQ là các trợ lý chứng minh (nghĩa là viết và kiểm tra bằng chứng) và không được sử dụng cho lập trình mục đích chung [31] [32]. Sự phát triển của Idris được dẫn dắt bởi Edwin Brady (người tạo ra Idris), hiện là giảng viên tại Đại học St Andrew [33]. Tuy nhiên, sự hỗ trợ và đóng góp hạn chế bên ngoài học viện có thể mang lại đủ sự không chắc chắn, chẳng hạn như khả năng sử dụng hoặc hỗ trợ lâu dài về ngôn ngữ, có thể hạn chế việc áp dụng công nghiệp.

  • Chúng có thể không phù hợp với các ngành công nghiệp với phương châm "di chuyển nhanh và phá vỡ mọi thứ". Một sự phù hợp tốt hơn có thể là các ngành công nghiệp nơi an ninh là tối quan trọng (quân sự, hàng không vũ trụ, tổ chức tài chính). Một tấm màn che bí mật có thể bao quanh các dự án đó làm giảm các trường hợp sử dụng đã biết.

Tình trạng hiện tại này có thể thay đổi vì đây là một lĩnh vực nghiên cứu phát triển liên tục (xem F.I. Công trình gần đây về lý thuyết loại định lượng kết hợp sự phụ thuộc với tính tuyến tính [34] [35]). Điều này sẽ lần lượt mở rộng các trường hợp sử dụng cho các ngôn ngữ được gõ phụ thuộc. Một trong những trường có khả năng hứa hẹn có thể là blockchain (cụ thể là viết các hợp đồng thông minh an toàn hơn). Trên thực tế, một khi hợp đồng thông minh được triển khai trên blockchain, mã của nó là bất biến [36]. Do đó, điều quan trọng là đảm bảo tính chính xác của hợp đồng thông minh trước khi triển khai nó trên blockchain [37]. Do đó, một thời gian dài hơn để biên soạn một hợp đồng thông minh dường như một mức giá nhỏ phải trả nếu điều đó có thể tăng cơ hội hành xử như mong đợi. Do đó, sử dụng ngôn ngữ lập trình được đánh máy phụ thuộc để mã hợp đồng thông minh dường như hoàn toàn phù hợp. Xem ví dụ JUVIX, một ngôn ngữ lập trình được đánh máy phụ thuộc được phát triển đặc biệt để lập trình hợp đồng thông minh an toàn hơn.

Sự kết luận

Các ngôn ngữ lập trình được gõ phụ thuộc làm giảm sự phân tách giữa các loại và thuật ngữ. Chúng cho phép các loại phụ thuộc vào một thuật ngữ thuộc loại khác, do đó làm tăng tính biểu cảm của mã lập trình viên và chi phí tính toán nhưng giảm các lỗi tiềm ẩn. Hơn nữa, lập trình viên có thể điều chỉnh mức độ biểu cảm của họ để tối đa hóa tỷ lệ lợi ích chi phí. Thật không may, tại thời điểm viết, việc áp dụng thương mại các loại phụ thuộc dường như bị cản trở. Điều này có thể là do thực tế là chúng khá gần đây, bị hiểu lầm và được coi là khó học, trong giây lát làm giảm mức độ kinh nghiệm và bộ kỹ năng có sẵn của các lập trình viên và do đó, lượng dự án tiềm năng có thể hưởng lợi từ chúng. Tuy nhiên, đó là một lĩnh vực nghiên cứu phát triển với các ứng dụng tiềm năng mới. Một lĩnh vực đầy hứa hẹn có thể là sử dụng một ngôn ngữ được đánh máy phụ thuộc để viết các hợp đồng thông minh an toàn hơn. Đây là trường hợp của JUVIX, một ngôn ngữ lập trình được đánh máy mới được phát triển đặc biệt để lập trình hợp đồng thông minh an toàn hơn.
Unfortunately, at the moment of writing, the commercial adoption of dependent types seems hindered. This could be due to the fact that they are quite recent, misunderstood and are perceived as hard to learn, momentarily reducing the experience levels and available skill set of programmers and thus the potential amount of projects that could benefit from them.
It is, however, an evolving field of study with new potential applications. One promising field could be to use a dependently typed language to write safer smart contracts. This is the case for instance of Juvix, which is a new dependently typed programming language specially developed to program safer smart contract.

Được viết bởi A. Samartino, nhà nghiên cứu blockchain tại Metastate.

Tín dụng hình ảnh: Cá mập chanh và Remoras từ Wikimedia.

Metastate đã ngừng hoạt động vào ngày 31 tháng 1 năm 2021. Các thành viên trong nhóm đã gia nhập một công ty mới và làm việc trong một dự án mới. Nếu bạn quan tâm đến lý thuyết ngôn ngữ lập trình, lập trình chức năng, lý thuyết nhập, xác minh chính thức hoặc vị trí kỹ thuật trình biên dịch, hãy xem các vị trí mở tại Heliax.

Nếu bạn có bất kỳ phản hồi hoặc câu hỏi nào về bài viết này, xin vui lòng liên hệ với chúng tôi:.


  1. Được đánh máy tự động là một cách hiểu sai thường được sử dụng theo Benjamin Pierce, một thuật ngữ tốt hơn có thể được "kiểm tra động" [2]

  2. Lưu ý rằng hàm mã trên có thể được gõ bằng ngôn ngữ được đánh máy phụ thuộc↩︎

  3. So sánh này không hoàn hảo vì trong khoa học máy tính, giá trị có thể có một số loại trong khi số lượng vật lý chỉ có thể có một chiều [7]

  4. Nó xuất phát từ một phân tích kích thước mà chúng ta nên nhân tốc độ theo thời gian để kết thúc với [m] ↩︎[m]↩︎

  5. ít nhất là trong hầu hết các ngôn ngữ được đánh máy thống kê↩︎

  6. Các loại phụ thuộc không giống như các loại là giá trị. Chẳng hạn, các loại phụ thuộc thứ nhất và thứ hai không nhất thiết có các loại là giá trị. Tuy nhiên, chúng hiếm khi được sử dụng trong thực tế, đó là lý do tại sao chúng ta sẽ không đi sâu vào nó.↩︎

Người giới thiệu

[1] Edwin Brady. Phát triển loại định hướng với IDRI. Manning, 2017. [2] Benjamin C. Pierce. Các loại và ngôn ngữ lập trình. Báo chí MIT, 2002. [3] Luca Cardelli. Loại hệ thống. 1997. [4] Samuel Baxter. Một triển khai ML của phép tính lambda được gõ phụ thuộc. 2014. [5] Magic nằm ở đây - Ngôn ngữ được đánh máy tự động. Truy cập: 2020-07-22. [6] về sublimelinter. . Truy cập: 2020-07-24. [7] Henk Barendregt. Giới thiệu về các hệ thống loại tổng quát. 1991. [8] Ulf Norell. Hướng tới một ngôn ngữ lập trình thực tế dựa trên lý thuyết loại phụ thuộc. Năm 2007 [9] Ulf Norell. Lập trình được đánh máy trong AGDA. 2009. [10] Jeremy Condit Matthew Harren Zachary Anderson David Gay và George C. Necula. Các loại phụ thuộc cho lập trình cấp thấp. Năm 2007 [11] Ana Bove và Peter Dybjer. Các loại phụ thuộc tại nơi làm việc. [12] Giới thiệu về lập trình trong ATS. Truy cập: 2020-07-16. [13] Tại sao bạn nên quan tâm đến lập trình được gõ phụ thuộc. Truy cập: 2020-07-16. [14] Andreas Abel. Giới thiệu về các loại phụ thuộc và AGDA. 2009. [15] Edwin C. Brady. Thực hiện thực tế của một ngôn ngữ lập trình chức năng được đánh máy. 2005. [16] Kevin Hammond Edwin Brady, Christoph Herrmann. Bất biến nhẹ với các loại phụ thuộc đầy đủ. [17] James McKinna Thorsten Altenkirch, Conor McBride. Tại sao các loại phụ thuộc quan trọng. 2005. [18] Jannis Grimm. Curry-Howard đẳng cấu xuống đất. 2015. [19] H. B. Curry. Chức năng trong logic kết hợp. 1934. [20] W. A. ​​Howard. Các khái niệm về công thức về xây dựng. 1980. [21] Philip Wadler. Đề xuất như các loại. 2014. [22] Giới thiệu nhẹ nhàng về đẳng cấu-Howard Curry-Howard được truy cập: 2020-07-30. [23] Wouter Swierstra Andres Löh, Conor McBride. Một hướng dẫn thực hiện một phép tính Lambda phụ thuộc. 2008 [24] Gilles Barthe và Thierry Coquand. Giới thiệu về lý thuyết loại phụ thuộc. 2002. [25] P. Castéran Y. Bertot. Định lý tương tác chứng minh và phát triển chương trình Coq'art: tính toán của các công trình quy nạp. 2004. [26] Edwin Brady. Idris | Lập trình hệ thống đáp ứng các loại phụ thuộc đầy đủ. 2011. [27] Nikhil Swamy Juan Chen Cedric Fournet Pierre-Yves Strub Karthikeyan Bhargavan Jean Yang. Lập trình phân tán an toàn với các loại phụ thuộc giá trị. 2011. [28] Boro Sitnikovski. Giới thiệu nhẹ nhàng về các loại phụ thuộc với IDRI. LeanPub, 2020. [29] Về việc học Haskell truy cập: 2020-08-06. [30] Haskell, ngôn ngữ rất có thể thay đổi cách bạn nghĩ về lập trình. Truy cập: 2020-08-06. [31] Wiki AGDA được truy cập: 2020-08-10. [32] Trợ lý bằng chứng COQ. Truy cập: 2020-08-10. [33] IDRIS: Ngôn ngữ phát triển theo kiểu truy cập: 2020- 08-10. [34] Edwin Brady. IDRIS 2: Lý thuyết loại định lượng trong hành động. 2018. [35] Robert Atkey. Cú pháp và ngữ nghĩa của lý thuyết loại định lượng. 2018. [36] Andreas M. Antonopoulos, Tiến sĩ Gavin Wood. Làm chủ Ethereum. O'Reilly, 2018. [37] Zibin Zheng, Shaoan Xie, Hong-ning Dai, Weili Chen, Xiangping Chen, Jian Weng, Muhammad Imran. Tổng quan về các hợp đồng thông minh: Thách thức, tiến bộ và nền tảng. 2019.
[2] Benjamin C. Pierce. Types and Programming Languages. The MIT Press, 2002.
[3] Luca Cardelli. Type systems. 1997.
[4] Samuel Baxter. An ML implementation of the dependently typed lambda calculus. 2014.
[5] Magic lies here - statically vs dynamically typed languages. Accessed: 2020-07-22.
[6] About sublimelinter. . Accessed: 2020-07-24.
[7] Henk Barendregt. Introduction to generalized type systems. 1991.
[8] Ulf Norell. Towards a practical programming language based on dependent type theory. 2007.
[9] Ulf Norell. Dependently typed programming in Agda. 2009.
[10] Jeremy Condit Matthew Harren Zachary Anderson David Gay and George C. Necula. Dependent types for low-level programming. 2007.
[11] Ana Bove and Peter Dybjer. Dependent types at work.
[12] Introduction to programming in ats. Accessed: 2020-07-16.
[13] Why you should care about dependently typed programming . Accessed: 2020-07-16.
[14] Andreas Abel. An introduction to dependent types and agda. 2009.
[15] Edwin C. Brady. Practical implementation of a dependently typed functional programming language. 2005.
[16] Kevin Hammond Edwin Brady, Christoph Herrmann. Lightweight invariants with full dependent types.
[17] James McKinna Thorsten Altenkirch, Conor McBride. Why dependent types matter. 2005.
[18] Jannis Grimm. Curry-howard isomorphism down-to-earth. 2015.
[19] H. B. Curry. Functionality in combinatory logic. 1934.
[20] W. A. Howard. The formulae-as-types notion of construction. 1980.
[21] Philip Wadler. Propositions as types. 2014.
[22] A gentle introduction to curry-howard isomorphism Accessed: 2020-07-30.
[23] Wouter Swierstra Andres Löh, Conor McBride. A tutorial implementation of a dependently-typed lambda calculus. 2008.
[24] Gilles Barthe and Thierry Coquand. An introduction to dependent type theory. 2002.
[25] P. Castéran Y. Bertot. Interactive theorem proving and program development coq'art: The calculus of inductive constructions. 2004.
[26] Edwin Brady. Idris | systems programming meets full dependent types. 2011.
[27] Nikhil Swamy Juan Chen Cedric Fournet Pierre-Yves Strub Karthikeyan Bhargavan Jean Yang. Secure distributed programming with value-dependent types. 2011.
[28] Boro Sitnikovski. Gentle Introduction to Dependent Types with Idris. Leanpub, 2020.
[29] On learning haskell Accessed: 2020-08-06.
[30] Haskell, the language most likely to change the way you think about programming. Accessed: 2020-08-06.
[31] The agda wiki Accessed: 2020-08-10.
[32] The coq proof assistant . Accessed: 2020-08-10.
[33] Idris: A language for type-driven development Accessed: 2020- 08-10.
[34] Edwin Brady. Idris 2: Quantitative type theory in action. 2018.
[35] Robert Atkey. Syntax and semantics of quantitative type theory. 2018.
[36] Andreas M. Antonopoulos, Dr. Gavin Wood. Mastering Ethereum. O'Reilly, 2018.
[37] Zibin Zheng, Shaoan Xie, Hong-Ning Dai, Weili Chen, Xiangping Chen, Jian Weng, Muhammad Imran. An overview on smart contracts: Challenges, advances and platforms. 2019.

Lập trình loại phụ thuộc là gì?

Trong khoa học máy tính và logic, một loại phụ thuộc là một loại có định nghĩa phụ thuộc vào giá trị. Nó là một tính năng chồng chéo của lý thuyết loại và hệ thống loại. Trong lý thuyết loại trực giác, các loại phụ thuộc được sử dụng để mã hóa các định lượng của logic như "cho tất cả" và "tồn tại".a type whose definition depends on a value. It is an overlapping feature of type theory and type systems. In intuitionistic type theory, dependent types are used to encode logic's quantifiers like "for all" and "there exists".

Chức năng phụ thuộc là gì?

Loại chức năng phụ thuộc là loại hàm có kết quả phụ thuộc vào các tham số của hàm.a function type whose result depends on the function's parameters.

Tại sao các loại phụ thuộc hữu ích?

Vì các loại phụ thuộc cho phép xác định các hình dạng chính xác hơn so với các loại khác và vì hệ thống loại có thể được sử dụng bởi trình kiểm tra loại để xác minh tính nhất quán của chương trình, các loại phụ thuộc cho phép xác định các chức năng trong một chương trình với các hạn chế đầu vào và đầu ra chính xác hơn làTự động kiểm tra ...allow defining more precise shapes than other kinds of types, and because type systems can be used by a type checker to verify the consistency of a program, dependent types allow defining functions in a program with more precise input and output restrictions that are automatically checked for ...

TypeScript có loại phụ thuộc không?

TypeScript không cung cấp các loại phụ thuộc, nhưng bằng cách kết hợp các tính năng khác nhau như công đoàn, loại nghĩa đen và các loại truy cập được lập chỉ mục, chúng ta có thể có được hành vi khá giống nhau với hàm phụ thuộc từ quan điểm của người gọi., but by combining various features such as unions, literal types and indexed access types we can obtain fairly similar behaviour to a dependent function from the caller point of view.