Spec-Zone.ru › Haskell 9

6.6.2. Вывод контекста для производных положений

Отчёт 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 занимает консервативную позицию: он принимает первые два, но не третий. Правило заключается в следующем: каждое ограничение в выведенном контексте экземпляра должно состоять только из переменных типов без повторений.

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

© 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.12.1/docs/users_guide/exts/deriving_inferred.html

Spec-Zone.ru

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