Ответ 1
GHC не может магически выводить экземпляры для произвольных типов данных. Однако это
может использовать тот факт, что объявления newtype
создают новое имя для
один и тот же базовый тип для вывода экземпляров для тех, кто использует
GeneralizedNewtypeDeriving
расширение. Итак, вы можете сделать что-то вроде этого:
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
newtype Something = Something Integer deriving (MyClass, Show)
class MyClass a where
hello :: MyClass a => a -> a
instance MyClass Integer where
hello i = i + 1
main = print . hello $ Something 3
Причина, по которой GHC не может получить новый экземпляр, заключается в том, что он не знает, что такое экземпляр
должно быть. Даже если у вашего типа данных есть только одно поле, это может быть необязательно
как это поле. Способность выводить экземпляры для newtype
удобна, поскольку они
обычно используются для обеспечения различного поведения для определенных типов классов или как способ
используйте систему типов для разделения вещей, которые имеют один и тот же тип, но разные применения в вашем коде.