Được rồi, chúng ta hãy đi từng người một.
Giá trị
Giá trị là những phần cụ thể của dữ liệu mà các chương trình đánh giá và tung hứng. Không có gì lạ mắt, một số ví dụ có thể là
1
true
"fizz buzz foo bar"
Các loại
Một mô tả hay cho một loại là "phân loại cho một giá trị". Một loại là một ít thông tin về giá trị đó sẽ là gì trong thời gian chạy, nhưng được chỉ định tại thời gian biên dịch.
Ví dụ: nếu bạn nói với tôi rằng e : bool
vào thời gian biên dịch, và tôi sẽ biết đó e
là true
hoặcfalse
trong thời gian chạy, không có gì khác! Vì các loại phân loại các giá trị độc đáo như thế này, chúng tôi có thể sử dụng thông tin này để xác định một số thuộc tính cơ bản của chương trình của bạn.
Ví dụ, nếu tôi từng thấy bạn thêm e
và e'
khi nào e : int
vàe' : String
, sau đó tôi biết một cái gì đó là một chút đi! Trong thực tế, tôi có thể gắn cờ này và đưa ra một lỗi trong thời gian biên dịch, nói rằng "Này, điều đó không có ý nghĩa gì cả!".
Một hệ thống loại mạnh hơn cho phép các loại thú vị hơn phân loại các giá trị thú vị hơn. Ví dụ: hãy xem xét một số chức năng
f = fun x -> x
Điều đó khá rõ ràng f : Something -> Something
, nhưng đó phải Something
là gì? Trong một hệ thống kiểu nhàm chán, chúng ta sẽ phải chỉ định một cái gì đó tùy ý, như thế nào Something = int
. Trong một hệ thống loại linh hoạt hơn, chúng ta có thể nói
f : forall a. a -> a
Đó là nói "cho bất kỳ a
, f
ánh xạ a
tới một a
". Điều này cho phép chúng tôi sử dụng f
chung hơn và viết các chương trình thú vị hơn.
Hơn nữa, trình biên dịch sẽ kiểm tra thực sự thỏa mãn trình phân loại mà chúng tôi đã đưa ra, nếu f = fun x -> true
sau đó chúng tôi có một lỗi và trình biên dịch sẽ nói như vậy!
Vì vậy, như một tldr; một kiểu là một ràng buộc thời gian biên dịch trên các giá trị mà một biểu thức có thể có trong thời gian chạy.
Kiểu xây dựng
Một số loại có liên quan. Ví dụ, một danh sách các số nguyên rất giống với danh sách các chuỗi. Điều này gần giống như cách sort
cho số nguyên gần giống nhưsort
đối với chuỗi. Chúng ta có thể tưởng tượng một loại nhà máy xây dựng các loại gần giống nhau này bằng cách khái quát hóa sự khác biệt của chúng và xây dựng chúng theo yêu cầu. Đó là những gì một nhà xây dựng kiểu. Nó giống như một chức năng từ loại đến loại, nhưng hạn chế hơn một chút.
Ví dụ cổ điển là một danh sách chung. Một constructor kiểu chỉ là định nghĩa chung
data List a = Cons a (List a) | Nil
Bây giờ List
là một hàm ánh xạ một loại a
vào danh sách các giá trị của loại đó! Ở vùng đất Java tôi nghĩ có lẽ chúng được gọi là "các lớp chung"
Loại tham số
Tham số kiểu chỉ là kiểu được truyền cho hàm tạo kiểu (hoặc hàm). Giống như ở mức giá trị, chúng ta sẽ nói foo(a)
có một tham số a
giống như cách List a
có một tham số loại a
.
Các loại
Các loại là một chút khó khăn. Ý tưởng cơ bản là một số loại tương tự nhau. Ví dụ, chúng tôi có tất cả các loại nguyên thủy trong java int
, char
, float
... mà tất cả cư xử như thể họ có cùng một "loại". Ngoại trừ, khi chúng ta nói về các trình phân loại cho chính các loại, chúng ta gọi các loại phân loại. Vì vậy int : Prim
, String : Box
, List : Boxed -> Boxed
.
Hệ thống này đưa ra các quy tắc cụ thể tốt đẹp về loại loại chúng ta có thể sử dụng ở đâu, giống như cách các loại chi phối các giá trị. Rõ ràng là vô nghĩa khi nói
List<List>
hoặc là
List<int>
Trong Java vì List
cần phải được áp dụng cho một loại cụ thể để được sử dụng như thế! Nếu chúng ta nhìn vào các loại của họ List : Boxed -> Boxed
và kể từ Boxed -> Boxed /= Boxed
trên, đây là một lỗi loại!
Hầu hết thời gian chúng ta không thực sự nghĩ về các loại và chỉ coi chúng là "lẽ thường", nhưng với các hệ thống kiểu fancier thì đó là điều quan trọng để suy nghĩ.
Một minh họa nhỏ về những gì tôi đã nói cho đến nay
value : type : kind : ...
true : bool : Prim : ...
new F() : Foo : Boxed : ...
Đọc tốt hơn Wikipedia
Nếu bạn quan tâm đến loại điều này, tôi khuyên bạn nên đầu tư một cuốn sách giáo khoa tốt. Lý thuyết loại và PLT nói chung là khá rộng lớn và không có nền tảng kiến thức mạch lạc, bạn (hoặc ít nhất là tôi) có thể đi lang thang mà không cần đi đâu trong nhiều tháng.
Hai cuốn sách yêu thích của tôi là
- Các loại và ngôn ngữ lập trình - Ben Pierce
- Cơ sở thực tiễn của ngôn ngữ lập trình - Bob Harper
Cả hai đều là những cuốn sách tuyệt vời giới thiệu những gì tôi vừa nói và nhiều chi tiết đẹp, được giải thích rõ ràng.