为什么这种不安全强制性不安全?

时间:2018-12-19 17:42:43

标签: haskell ghc

某些库使用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 => ra -> r在GHC中具有相同的运行时表示形式?

1 个答案:

答案 0 :(得分:15)

没有官方文件可以保证。 Ed Kmett依靠他对GHC内部运作的了解。他所知道的:

  1. 在GHC Core中,->=>实际上是同一件事。
  2. 没有超类的单方法类实例的字典像新类型一样被删除-字典方法。

我实际上已经编写了一个proposal来尝试合法地执行此操作,但是正确容纳所有用例是很棘手的。