<$>
(aka fmap
) là một thành viên của lớp functor như vậy:
class Functor f where
fmap :: (a -> b) -> f a -> f b
Vì vậy, bất cứ điều gì f là phải là một loại parameterised với một đối số kiểu. Danh sách là một loại như vậy, khi được viết ở dạng tiền tố []
([] a
giống như [a]
). Vì vậy, các ví dụ cho các danh sách là:
instance Functor [] where
-- fmap :: (a -> b) -> [] a -> [] b
fmap = map
cặp cũng có thể được viết dưới dạng tiền tố: (,) a b
cũng giống như (a, b)
. Vì vậy, chúng ta hãy xem xét những gì chúng ta làm nếu chúng ta muốn một cá thể Functor liên quan đến các cặp. Chúng tôi không thể khai báo số instance Functor (,)
vì hàm tạo cặp (,)
có hai loại - và chúng có thể là các loại khác nhau! Những gì chúng ta có thể làm là khai báo một ví dụ cho (,) a
- đó là một loại mà chỉ cần thêm một loại:
instance Functor ((,) a) where
-- fmap :: (b -> c) -> (,) a b -> (,) a c
fmap f (x, y) = (x, f y)
Hy vọng rằng bạn có thể thấy rằng định nghĩa của fmap là một hợp lý duy nhất chúng tôi có thể cung cấp. Câu trả lời là tại sao thể hiện functor hoạt động trên mục thứ hai trong một cặp là kiểu cho mục thứ hai xuất hiện cuối cùng trong danh sách! Chúng ta không thể dễ dàng khai báo một cá thể functor hoạt động trên mục đầu tiên trong một cặp. Ngẫu nhiên, điều này nói chung với các bộ dữ liệu lớn hơn, ví dụ: các bốn (,,,) a b c d
(aka (a, b, c, d)
) cũng có thể có một trường hợp Functor
vào mục cuối cùng:
instance Functor ((,,,) a b c) where
-- fmap :: (d -> e) -> (,,,) a b c d -> (,,,) a b c e
fmap f (p, q, r, s) = (p, q, r, f s)
Hy vọng rằng sẽ giúp giải thích tất cả!
Câu hỏi này có liên quan: http://stackoverflow.com/questions/3155469/help-haskell-functors-sink-in/3164774#3164774 –