Из руководства GHC, раздел Безопасный язык:
Управление границей модулей - код Haskell, скомпилированный с использованием безопасного языка, гарантирован только доступом к общедоступным символам, доступным через другие списки экспорта модулей. Важной частью этого является то, что безопасный скомпилированный код не может проверять или создавать данные с использованием конструкторов данных, которые он не может импортировать. Если модуль M устанавливает некоторые инварианты посредством тщательного использования его экспортного списка, то код, скомпилированный с использованием безопасного языка, который импортирует M, гарантированно соблюдает эти инварианты. Из-за этого Template Haskell и
GeneralizedNewtypeDeriving
отключены на безопасном языке, поскольку они могут использоваться для нарушения этого свойства.
Как можно разбить инварианты модуля с помощью GeneralizedNewtypeDeriving
?