Почему это небезопасно? Конечно, небезопасно? - PullRequest
0 голосов
/ 19 декабря 2018

Некоторые библиотеки используют 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?

1 Ответ

0 голосов
/ 19 декабря 2018

Ни один официальный документ не гарантирует это.Эд Кметт полагается на то, что он знает о внутренней работе GHC.Что он знает:

  1. В GHC Core -> и => фактически означают одно и то же.
  2. Словари для экземпляров классов с одним методом без суперклассов стираются как новые типы- словарь - это метод.

Я на самом деле написал предложение , чтобы попытаться сделать это законно, но сложно приспособиться ко всему использованиюдела правильно.

...