Haskell - есть ли способ отключить повторно привязываемый синтаксис для случая `создания` экземпляров? - PullRequest
6 голосов
/ 27 января 2012

Существует раздражающая «особенность», что расширение производных RebindableSyntax также влияет на производные экземпляры.Пример того, что я хочу написать:

{-# LANGUAGE RebindableSyntax #-}
import qualified Prelude
data Color = Red | Green | Blue | Periwinkle | Fuschia deriving (Prelude.Eq, Prelude.Ord)

Это приводит к ошибке "Нет в области действия:` ifThenElse '".

1 Ответ

7 голосов
/ 27 января 2012

Это кажется мне ошибкой - предложение deriving в любом случае полно встроенной магии, поэтому я скептически отношусь к тому, что производные экземпляры, использующие синтаксис отскока, будут полезны на практике. Теперь, если бы вы могли перепривязать само предложение deriving и использовать вместо него соединение TH ... но я отвлекся.

Я подозреваю, что самое простое и простое решение - использовать разные модули. Поместите определение типа данных в его собственный модуль, используйте предложение deriving там с функциями Prelude в области действия, затем импортируйте тип в модуле, используя синтаксис повторной привязки. Если вам нужна дополнительная модульность в ваших модулях, обратите внимание, что StandaloneDeriving также существует и позволит вам определять типы в одном модуле (с активным RebindableSyntax), извлекать экземпляры в другом модуле (без RebindableSyntax) и импортировать оба из модулей, которые на самом деле используют тип.

...