2012-03-25 38 views
10

Tôi đang xem qua sổ Haskell wiki GADTSChữ ký Loại

https://en.wikibooks.org/wiki/Haskell/GADT hướng dẫn.

Tôi đã theo dõi khá tốt cho đến khi chữ ký Kind được thêm vào, khái quát hóa loại ràng buộc của hàm tạo Cons.

data Safe 
data NotSafe 

data MarkedList    :: * -> * -> * where 
    Nil      :: MarkedList t NotSafe 
    Cons      :: a -> MarkedList a b -> MarkedList a c 

safeHead     :: MarkedList a Safe -> a 
safeHead (Cons x _)   = x 


silly 0      = Nil 
silly 1      = Cons() Nil 
silly n      = Cons() $ silly (n-1) 

Với chữ ký loại Tôi có thể sử dụng hàm tạo tiêu chuẩn để xây dựng và khớp mẫu với cả Đánh dấu an toàn và không an toàn. Trong khi tôi hiểu những gì đang xảy ra, tôi không may gặp khó khăn trong việc xây dựng bất kỳ trực giác nào về cách Chữ ký Kind cho phép điều này. Tại sao tôi cần Chữ ký Loại? Chữ ký Kind là gì?

Trả lời

12

Giống như cách chữ ký loại hoạt động cho các giá trị, chữ ký loại hoạt động cho các loại.

f :: Int -> Int -> Bool 
f x y = x < y 

Ở đây, f lấy hai giá trị đối số và tạo ra giá trị kết quả. Tương đương với nhiều loại có thể là:

data D a b = D a b 

Loại D mất hai loại đối số và tạo ra một loại kết quả (nó là * -> * -> *). Ví dụ: D Int String là loại (có loại *). Ứng dụng một phần D Int có loại * -> *, giống như cách ứng dụng một phần f 15 có loại Int -> Bool.

Vì vậy, chúng ta có thể viết lại trên như:

data D :: * -> * -> * where 
    D :: a -> b -> D a b 

Trong GHCi, bạn có thể truy vấn các loại và các loại:

> :type f 
f :: Int -> Int -> Bool 
> :kind D 
D :: * -> * -> * 
+0

Im vẫn bối rối vì 'MarkedList ab nơi ... 'dường như làm việc trong GHC 7.4.1. Tôi không chắc chắn chữ ký loại cung cấp. – ExternalReality

+1

Điều đó giống như một cách khác để nói cùng một điều với tôi. –

+0

Có, nhưng Chữ ký Loại cần pragma ngôn ngữ trong khi chữ cái thứ hai thì không. Tại sao, nếu cả hai cách đều giống nhau? Chữ ký loại bổ sung cung cấp thêm những gì? – ExternalReality

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