2012-08-13 32 views
5

Tại sao việc áp dụng một phần chức năng với các chữ ký khác nhau hoạt động?Giải thích về ứng dụng một phần - tham gia

Hãy Control.Monad.join làm ví dụ:

GHCi> :t (=<<) 
(=<<) :: Monad m => (a -> m b) -> m a -> m b 
GHCi> :t id 
id :: a -> a 
GHCi> :t (=<<) id 
(=<<) id :: Monad m => m (m b) -> m b 

Tại sao nó chấp nhận id :: a -> a ở vị trí của (a -> m b) cãi nhau, vì họ là rõ ràng là khác nhau?

Trả lời

10

=<< chữ ký của loại cho biết đối số đầu tiên là hàm từ a (bất kỳ thứ gì) cho một đơn vị là b.

Vâng, m b được tính là bất cứ điều gì, đúng không? Vì vậy, chúng tôi chỉ có thể thay thế trong m b cho mỗi a:

(=<<) :: Monad m => (m b -> m b) -> m (m b) -> m b 

id s loại nói rằng nó là một chức năng từ bất cứ điều gì với bất cứ điều gì tương tự. Vì vậy, nếu chúng ta phụ trong m b (không quên chế đơn nguyên), ta có:

id :: Monad m => m b -> m b 

Sau đó, bạn có thể thấy rằng các trận đấu loại.

+0

Nghe có vẻ đơn giản và dễ hiểu, cảm ơn. Là chữ ký cuối cùng của = << id bằng cách nào đó suy ra từ giá trị trả về để khớp với phần còn lại của đối số hàm? –

+0

@David có, tôi tin rằng đó là cơ bản chính xác. –

2

Nó cố gắng để thống nhất a với m b, và chỉ đơn giản là quyết định rằng a phải m b, vì vậy các loại (theo giả định a ~ m b) là Monad m => (mb -> m b) -> m (m b) -> m b, và một khi bạn áp dụng nó vào id, bạn là trái với Monad m => m (m b) -> m b.

3

Một số khái niệm hữu ích để sử dụng ở đây:

  1. Bất kỳ loại với một biến a có thể được chuyển đổi thành một loại khác nhau bằng cách thay thế mỗi thể hiện của a với bất kỳ loại khác t. Vì vậy, nếu bạn có loại a -> b -> c, bạn có thể có được loại a -> d -> c hoặc loại a -> b -> Int bằng cách thay thế b với d hoặc c tương ứng với Int.
  2. Bất kỳ hai loại nào có thể được chuyển đổi với nhau bằng cách thay thế đều tương đương nhau. Ví dụ: a -> bc -> d tương đương (a ~ c, b ~ d).
  3. Nếu một loại t có thể được chuyển đổi sang một loại t', nhưng t' không thể được chuyển đổi trở lại t, sau đó chúng ta nói rằng t' là một chuyên môn hóa của t. Ví dụ: a -> a là chuyên môn của a -> b.

Bây giờ, với những khái niệm rất hữu ích này, câu trả lời cho câu hỏi của bạn rất đơn giản: ngay cả khi các loại "bản địa" của hàm không khớp chính xác, chúng tương thích vì chúng có thể được viết lại hoặc chuyên biệt kết hợp chuẩn xác. Câu trả lời của Matt Fenwick cho thấy các chuyên ngành làm điều đó cho trường hợp này.

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