Hãy để tôi bù đắp cho việc bắt đầu một số sự nhầm lẫn này bằng cách đưa ra một số định hướng. Tôi thích sử dụng sự tương tự với mức giá trị để giải thích điều này, vì mọi người có xu hướng quen thuộc hơn với nó.
Hàm tạo kiểu là một kiểu mà bạn có thể áp dụng để gõ đối số để "xây dựng" một kiểu.
Hàm tạo giá trị là một giá trị mà bạn có thể áp dụng cho các đối số giá trị để "xây dựng" một giá trị.
Các hàm tạo giá trị thường được gọi là "hàm" hoặc "phương thức". Các "nhà xây dựng" này cũng được gọi là "đa hình" (bởi vì chúng có thể được sử dụng để xây dựng "công cụ" có "hình dạng" khác nhau) hoặc "trừu tượng" (vì chúng trừu tượng hóa những gì khác nhau giữa các thời điểm đa hình khác nhau).
Trong bối cảnh trừu tượng / đa hình, thứ tự đầu tiên đề cập đến "sử dụng một lần" trừu tượng: bạn trừu tượng hóa một loại một lần, nhưng bản thân loại đó không thể trừu tượng hơn bất cứ điều gì. Java 5 generic là thứ nhất.
Giải thích theo thứ tự đầu tiên về các đặc tính trừu tượng ở trên là:
Hàm tạo kiểu là một kiểu mà bạn có thể áp dụng cho các đối số kiểu thích hợp để "xây dựng" một kiểu thích hợp.
Hàm tạo giá trị là một giá trị mà bạn có thể áp dụng cho các đối số giá trị phù hợp để "xây dựng" một giá trị phù hợp.
Để nhấn mạnh không có trừu tượng liên quan (tôi đoán bạn có thể gọi đây là "zero-trật tự", nhưng tôi đã không nhìn thấy bất cứ nơi nào sử dụng này), chẳng hạn như giá trị 1
hoặc các loại String
, chúng ta thường nói điều gì đó là một giá trị "đúng" hoặc gõ.
Một giá trị phù hợp là "có thể sử dụng ngay lập tức" theo nghĩa là nó không chờ đợi các đối số (nó không trừu tượng đối với chúng). Hãy nghĩ về chúng như các giá trị mà bạn có thể dễ dàng in / kiểm tra (tuần tự hóa một chức năng là gian lận!).
Một kiểu thích hợp là một kiểu phân loại các giá trị (bao gồm các hàm tạo giá trị), các hàm tạo kiểu không phân loại bất kỳ giá trị nào (trước tiên chúng cần được áp dụng cho các đối số kiểu đúng để mang lại một kiểu thích hợp). Để khởi tạo một loại, nó là cần thiết (nhưng không đủ) rằng đó là một loại thích hợp. (Nó có thể là một lớp trừu tượng hoặc một lớp mà bạn không có quyền truy cập.)
"Thứ tự cao hơn" chỉ đơn giản là một thuật ngữ chung có nghĩa là sử dụng lặp lại đa hình / trừu tượng. Nó có nghĩa là điều tương tự cho các loại và giá trị đa hình. Cụ thể, một sự trừu tượng hóa bậc cao trừu tượng hơn một cái gì đó trừu tượng hóa trên một cái gì đó. Đối với các loại, thuật ngữ "loại cao hơn" là phiên bản có mục đích đặc biệt của "thứ tự cao hơn" tổng quát hơn.
Do đó, phiên bản bậc cao của đặc tính của chúng tôi trở thành:
Hàm tạo kiểu là một kiểu mà bạn có thể áp dụng cho kiểu đối số (kiểu đúng hoặc hàm tạo kiểu) để "xây dựng" một kiểu thích hợp (hàm tạo).
Hàm tạo giá trị là một giá trị mà bạn có thể áp dụng cho các đối số giá trị (giá trị phù hợp hoặc hàm tạo giá trị) để "xây dựng" một giá trị phù hợp (hàm tạo).
Do đó, "bậc cao" đơn giản có nghĩa là khi bạn nói "trừu tượng hóa X", bạn thực sự có ý đó! Cái X
được trừu tượng hóa không làm mất "quyền trừu tượng" của chính nó: nó có thể trừu tượng hóa tất cả những gì nó muốn. (Nhân tiện, tôi sử dụng động từ "trừu tượng" ở đây có nghĩa là: bỏ đi một cái gì đó không cần thiết cho định nghĩa của một giá trị hoặc loại, để nó có thể được thay đổi / cung cấp bởi người sử dụng trừu tượng làm đối số .)
Dưới đây là một số ví dụ (lấy cảm hứng từ các câu hỏi của Lutz qua email) về các giá trị và loại phù hợp, thứ nhất và thứ tự cao hơn:
proper first-order higher-order
values 10 (x: Int) => x (f: (Int => Int)) => f(10)
types (classes) String List Functor
types String ({type λ[x] = x})#λ ({type λ[F[x]] = F[String]})#λ
Trong đó các lớp được sử dụng được định nghĩa là:
class String
class List[T]
class Functor[F[_]]
Để tránh sự gián tiếp thông qua việc xác định các lớp, bạn cần thể hiện bằng cách nào đó biểu thị các hàm loại ẩn danh, không thể biểu thị trực tiếp trong Scala, nhưng bạn có thể sử dụng các kiểu cấu trúc mà không cần quá nhiều cú pháp ( #λ
kiểu này là do https://stackoverflow.com / users / 160378 / retronym afaik):
Trong một số phiên bản giả định trong tương lai của Scala hỗ trợ các hàm loại ẩn danh, bạn có thể rút ngắn dòng cuối cùng từ các ví dụ thành:
types (informally) String [x] => x [F[x]] => F[String]) // I repeat, this is not valid Scala, and might never be
(Trên một ghi chú cá nhân, tôi rất tiếc đã từng nói về "các loại loại cao hơn", tất cả chúng chỉ là các loại! Khi bạn thực sự cần phải phân tán, tôi khuyên bạn nên nói những thứ như "tham số hàm tạo kiểu", "thành viên hàm tạo kiểu" hoặc "bí danh nhà xây dựng kiểu", để nhấn mạnh rằng bạn không nói về chỉ các loại thích hợp.)
ps: Để làm phức tạp vấn đề hơn nữa, "đa hình" không rõ ràng theo một cách khác, vì một loại đa hình đôi khi có nghĩa là một loại được định lượng phổ biến, như Forall T, T => T
, là một loại thích hợp, vì nó phân loại các giá trị đa hình (trong Scala, giá trị này có thể được phân loại được viết dưới dạng cấu trúc {def apply[T](x: T): T = x}
)