t
là thông số loại của lớp Tofu
loại * -> (* -> *) -> *
(viết t :: * -> (* -> *) -> *
). Đây là loại được suy ra là t
bởi GHC vì trong trường hợp không có -XPolyKinds
, GHC cố gắng mặc định tất cả các thông số loại thành loại *
. Vì vậy, GHC giả định a
có loại *
(mặc dù không có gì trong chữ ký của bạn làm cho sự lựa chọn duy nhất này).
Các loại constructor (->)
có loại* -> * -> *
. Kể từ khi j a
xuất hiện dưới dạng tham số cho (->)
, j a
phải có loại *
. Vì GHC đã giả định rằng a
có loại *
, j
là một loại có thứ gì đó thuộc loại *
và trả lại một thứ gì đó loại *
. Như vậy:
j :: * -> *
Kể từ t
được áp dụng cho cả hai a
và j
, t
có loại * -> (* -> *) -> *
, bởi vì đối số đầu tiên a
có loại *
và đối số thứ hai j
có loại *->*
, và loại tổng thể t a j
phải có loại *
vì nó cũng là một tham số của loại (->)
.
Lớp học chỉ là loại dùng tham số kiểu (giống như data Foo a b
), trừ Foo a b
có loại *
khi Tofu t
có loại một loại đặc biệt Constraint
. Do đó, loại Tofu
là:
(* -> (* -> *) -> *) -> Constraint
như GHC cho biết. Constraint
chỉ là loại cho ràng buộc. Trong chữ ký
(Num a) => a -> a -> a
(Num a)
là một loại của loạiConstraint
.
Tôi gần như đã hiểu, nhưng tôi là người mới bắt đầu. Bạn có thể xây dựng một chút không? – orome
Đó là một chút khó hiểu nếu tôi nhìn vào 't tofu', thực sự. Mặc dù tôi vẫn còn một chút sương mù. – orome
đang thực hiện cập nhật ngay bây giờ – crockeea