-
DeriveAnyClass -
- Since:
-
7.10.1
Разрешить использование любого типа класса в
derivingпредложениях.
С помощью DeriveAnyClass вы можете унаследовать любой другой класс. Компилятор просто сгенерирует объявление экземпляра без явно определенных методов. Это в основном полезно в классах, у которых минимальный набор минимален, и особенно при написании обобщенных функций.
В качестве примера рассмотрим простой класс красивого вывода SPretty, который выводит красивые строки:
{-# LANGUAGE DefaultSignatures, DeriveAnyClass #-}
class SPretty a where
sPpr :: a -> String
default sPpr :: Show a => a -> String
sPpr = show
Если пользователь не предоставит ручную реализацию для sPpr, то он по умолчанию будет show. Теперь мы можем использовать расширение DeriveAnyClass, чтобы легко реализовать экземпляр SPretty для нового типа данных:
data Foo = Foo deriving (Show, SPretty)
Приведённый выше код эквивалентен:
data Foo = Foo deriving Show instance SPretty Foo
То есть, экземпляр SPretty Foo будет создан с пустыми реализациями для всех методов. Поскольку в этом примере используется DefaultSignatures, по умолчанию реализация sPpr заполняется автоматически.
Обратите внимание на следующие детали