2015-08-21 14 views
5

Các Haskell hướng dẫn, tôi đang đọc có một phần giới thiệu những điều cơ bản của loại kinds, và mô tả một kiểu lớpTại sao loại của tôi có '-> Hạn chế' ở cuối?

class Tofu t where 
    tofu :: j a -> t a j 

là có loại

* -> (* -> *) -> * 

Tôi hiểu rằng, nhưng khi tôi nhập :k Tofu trong GHCi, tôi nhận được

Tofu :: (* -> (* -> *) -> *) -> GHC.Prim.Constraint 

là gì GHC.Prim.Constraint và tại sao các loại Tofu có biểu mẫu này thay vì chỉ đơn giản là * -> (* -> *) -> *?

Trả lời

6

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 (->)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 aj, 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 jphả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.

+0

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

+0

Đó 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

+0

đang thực hiện cập nhật ngay bây giờ – crockeea

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