2013-02-11 39 views
16

Đối với xa như tôi hiểu, một functor là một ánh xạ giữa hai loại, ví dụ từ các đối tượng trong C http://mathurl.com/32qch9w.png đến các đối tượng trong D http://mathurl.com/36b8r37.png trong đó C http://mathurl.com/32qch9w.pngD http://mathurl.com/36b8r37.png là các danh mục.Làm thế nào các functors trong Haskell liên quan đến functors trong lý thuyết thể loại?

Trong Haskell có Hask trong đó đối tượng là loại Haskell và hình thái là hàm Haskell. Tuy nhiên, kiểu lớp Functor có chức năng fmap mà bản đồ giữa các loại (mà là do các đối tượng và không loại tự):

fmap :: (a -> b) -> f a -> f b 

f af b đều các đối tượng trong Hask. Điều này có nghĩa là mọi trường hợp của Functor trong Haskell là một endofunctor, và nếu không thì Functor thực sự đại diện cho một functor?

Tôi thiếu gì ở đây? Các loại cũng có trong Haskell không?

Trả lời

23

Một thể hiện của Functor xác định hai điều: một loại constructor F loại * -> *, đó là một ánh xạ từ đối tượng của Hask các đối tượng của Hask, và một chức năng của loại (a -> b) -> (F a -> F b), đó là một ánh xạ từ mũi tên của Hask đến các mũi tên của Hask tương thích với ánh xạ đối tượng F. Vì vậy, vâng, tất cả các trường hợp của Functor là những người kết thúc. Có một số tổng quát có sẵn trên Hackage, ví dụ: Control.Categorical.Functor.

+0

Bạn nói * mũi tên của Hask tương thích với ánh xạ đối tượng 'F' *. Đó có phải là một tiểu thể loại của Hask? –

+2

@Zoidberg Yup, đó là danh mục con của Hask có đối tượng là các kiểu có hàm tạo ngoài cùng là 'F'. –

+0

Tôi hiểu điều này một cách chính xác: về mặt lý thuyết các endofunctors không nhất thiết phải làm việc trên các loại với loại '* -> *', tôi có nghĩa là functor có thể ánh xạ một hàm 'Int -> Char' để hoạt động' String -> Double'. Theo tôi hiểu, trong lý thuyết các giảng viên làm việc trên bất kỳ hình thái nào. Nhưng tôi đoán đó không phải là quá thực tế. Hay tôi hoàn toàn sai ở đây? – dimsuz

15

Vâng, tất cả các trường hợp được Functor endofunctors trên Hask --Trong thực tế, endofunctors từ tất cả các Hask đến một tiểu thể loại thích hợp mà đối tượng là các loại thu được bằng cách áp dụng một constructor loại cụ thể. Trình tạo kiểu đó là kiểu cá thể Functor được liên kết với, và cung cấp ánh xạ cho các đối tượng; ánh xạ cho hình thái là fmap, mà (bởi vì chúng ta chỉ quan tâm đến các nhà kết thúc trong một thể loại đóng kín) là một họ của các hình thái trong Hask. Nó có ý nghĩa để xem xét các functors khác ngoài những người có thể có Functor trường hợp, chẳng hạn như contravariant functors (từ Hask đến thể loại đối diện của nó). Các arr chức năng trong the Arrow class cũng tương ứng với một functor, từ tất cả các Hask vào ngạch mà đối tượng cũng giống như những người Hask và có morphisms được mô tả bởi các nhà xây dựng kiểu instance Arrow được liên kết với.

Các khái quát chung khác cũng có thể (như Daniel Wagner lưu ý), nhưng có xu hướng ngày càng trở nên khó xử khi sử dụng.

4

Một điểm quan trọng về vấn đề này là những gì bạn thực sự muốn là functors giàu trong Hask, không chỉ functors đồng bằng cũ. Hask được đóng cửa theo kiểu Descartes (not really, nhưng nó rất khó để có thể làm được), và vì vậy nó tự nhiên được làm giàu.

Bây giờ, endofunctors giàu cung cấp cho bạn một cách để hạn chế những implementable trong ngôn ngữ: một functor giàu Hask -> Hask là một chức năng ở cấp độ của các đối tượng (các loại) f a và cho mỗi cặp của các đối tượng a, b một cấu xạ trong Hask đi f: Hask (a, b) ->Hask (fa, fb). Tất nhiên, đây chỉ là fmap :: (a -> b) -> f a -> f b