map
tồn tại để đơn giản hóa các thao tác trên danh sách và vì lý do lịch sử (xem Điểm bản đồ trong Haskell là gì, khi có fmap? ).
Bạn có thể hỏi tại sao chúng ta cần một chức năng bản đồ riêng biệt. Tại sao không loại bỏ chức năng bản đồ chỉ danh sách hiện tại và đổi tên fmap thành bản đồ? Chà, đó là một câu hỏi hay. Lập luận thông thường là ai đó mới học Haskell, khi sử dụng bản đồ không chính xác, sẽ thấy lỗi về danh sách hơn là về Functors.
- Từ điển điển hình , trang 20
fmap
và liftM
tồn tại bởi vì các monads không tự động là bộ phân giải trong Haskell:
Việc chúng ta có cả fmap và liftM là một hệ quả không may của thực tế là lớp kiểu Monad không yêu cầu thể hiện Functor, mặc dù về mặt toán học, mọi đơn nguyên đều là một hàm functor. Tuy nhiên, fmap và liftM về cơ bản có thể hoán đổi cho nhau, vì nó là một lỗi (theo nghĩa xã hội chứ không phải là kỹ thuật) đối với bất kỳ loại nào là một bản sao của Monad mà không phải là một bản sao của Functor.
- Từ điển điển hình , trang 33
Chỉnh sửa: lịch sử của agustuss map
và fmap
:
Đó không thực sự là cách nó xảy ra. Điều đã xảy ra là loại bản đồ đã được khái quát hóa để bao phủ Functor trong Haskell 1.3. Tức là trong Haskell 1.3 fmap được gọi là bản đồ. Thay đổi này sau đó đã được hoàn nguyên trong Haskell 1.4 và fmap đã được giới thiệu. Lý do cho sự thay đổi này là do sư phạm; khi dạy Haskell cho người mới bắt đầu về loại bản đồ rất chung chung khiến các thông báo lỗi trở nên khó hiểu hơn. Theo tôi đây không phải là cách đúng đắn để giải quyết vấn đề.
- Điểm bản đồ trong Haskell là gì, khi có fmap?