В настоящее время я в Глава 8 Учите вас Haskell, и я дошел до раздела на Functor
typeclass. В этом разделе автор приводит примеры того, как могут быть созданы различные типы экземпляров класса (например, Maybe
, пользовательский тип Tree
и т.д.). Увидев это, я решил (для удовольствия и практики) попробовать реализовать экземпляр для Data.Set
; во всех этих случаях, конечно, игнорируя Data.Set.map
.
Фактический экземпляр сам по себе довольно прямолинейный, и я написал его как:
instance Functor Set.Set where
fmap f empty = Set.empty
fmap f s = Set.fromList $ map f (Set.elems s)
Но, поскольку я использую функцию fromList
, это приводит к ограничению класса, вызывающему типы, используемые в Set
быть Ord
, что объясняется ошибкой компилятора:
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
Смотрите: Пример Live
Я попытался установить ограничение на экземпляр или добавить подпись типа к fmap
, но ни одно из них не удалось (оба были ошибками компилятора.)
Учитывая такую ситуацию, как можно выполнить и удовлетворить ограничение? Есть ли способ?
Спасибо заранее!:)