某些库使用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
(此示例来自reflection软件包。 singletons软件包也使用此技巧。)
这个unsafeCoerce
为什么安全?
是否有任何官方文件可以保证Given a => r
和a -> r
在GHC中具有相同的运行时表示形式?
答案 0 :(得分:15)
没有官方文件可以保证。 Ed Kmett依靠他对GHC内部运作的了解。他所知道的:
->
和=>
实际上是同一件事。我实际上已经编写了一个proposal来尝试合法地执行此操作,但是正确容纳所有用例是很棘手的。