Tôi hiện đang ở Chapter 8 trong số Learn you a Haskell và tôi đã đến phần trên Functor
kiểu chữ. Trong phần nói trên, tác giả đưa ra các ví dụ về cách các kiểu khác nhau có thể được tạo ra trong các lớp (ví dụ: Maybe
, một kiểu tùy chỉnh Tree
, v.v.) Xem này, tôi quyết định (để vui và thực hành) thử thực hiện một thể hiện cho loại Data.Set
; trong tất cả điều này bỏ qua Data.Set.map
, tất nhiên.Làm thế nào để statisfy một lớp hạn chế trong một thể hiện của một lớp đòi hỏi một constructor kiểu chứ không phải là một loại cụ thể?
Các ví dụ thực tế chính nó là khá thẳng về phía trước, và tôi đã viết nó như:
instance Functor Set.Set where
fmap f empty = Set.empty
fmap f s = Set.fromList $ map f (Set.elems s)
Nhưng, kể từ khi tôi xảy ra để sử dụng chức năng fromList
này mang lại trong một hạn chế lớp gọi cho các loại được sử dụng trong Set
là Ord
, như được giải thích bởi một lỗi biên dịch:
Error occurred
ERROR line 4 - Cannot justify constraints in instance member binding
*** Expression : fmap
*** Type : Functor Set => (a -> b) -> Set a -> Set b
*** Given context : Functor Set
*** Constraints : Ord b
Xem: Live Example
tôi tri ed đặt một ràng buộc vào cá thể, hoặc thêm chữ ký loại vào fmap
, nhưng không thành công (cả hai đều là lỗi trình biên dịch.)
Với một tình huống như thế này, làm thế nào một ràng buộc có thể được đáp ứng và thỏa mãn? Có cách nào có thể không?
Cảm ơn trước! :)
một vấn đề với các lớp functor bó buộc là chúng ta mất rất nhiều năng lượng. Đặc biệt với các functors ứng dụng, chúng ta thường muốn đặt các chức năng vào chúng. Tuy nhiên, trong nhiều trường hợp không thể cung cấp các trường hợp chung của các lớp mà chúng ta quan tâm cho các hàm. – hammar