Некоторые библиотеки используют unsafeCoerce
для временного удовлетворения ограничения:
class Given a where given :: a
newtype Gift a r = Gift (Given a => r)
give :: forall a r. a -> (Given a => r) -> r
give a k = unsafeCoerce (Gift k :: Gift a r) a
(Этот пример из пакета reflections . singletons package также использует этот трюк.)
Почему это unsafeCoerce
безопасно?Существует ли какой-либо официальный документ, гарантирующий, что Given a => r
и a -> r
имеют одинаковое представление времени выполнения в GHC?