Spec-Zone.ru › Haskell 9

6.6.2. Выводимый контекст для объявлений deriving

В отчёте Haskell не вполне ясно указано, когда допустимо объявление deriving. Например:

data T0 f a = MkT0 a         deriving( Eq )
data T1 f a = MkT1 (f a)     deriving( Eq )
data T2 f a = MkT2 (f (f a)) deriving( Eq )

Естественный сгенерированный код Eq привёл бы к следующим объявлениям экземпляров:

instance Eq a         => Eq (T0 f a) where ...
instance Eq (f a)     => Eq (T1 f a) where ...
instance Eq (f (f a)) => Eq (T2 f a) where ...

Первое из них, очевидно, корректно. Второе тоже корректно, хотя это не так очевидно. Третье не соответствует Haskell 98 и может привести к потере завершаемости экземпляров.

GHC придерживается консервативного подхода: он принимает первые два, но не третье. Правило таково: каждое ограничение в выведенном контексте экземпляра должно состоять только из переменных типов, без повторений.

Это правило применяется независимо от флагов. Если вам нужен более экзотический контекст, вы можете указать его самостоятельно, используя механизм самостоятельного deriving.

© 2002–2007 The University Court of the University of Glasgow. All rights reserved.
Licensed under the Glasgow Haskell Compiler License.
https://downloads.haskell.org/~ghc/9.14.1/docs/users_guide/exts/deriving_inferred.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API