信任具有无聊参数的函数类型

时间:2015-12-05 20:08:59

标签: haskell ghc coercion

作为一般规则,Haskell类型只有在不包含任何函数时才能被信任,因为Haskell允许运行时错误和非终止,即使这样,只有当它们被完全强制时。所以一般情况下,如果我有一个函数f :: X -> Y,并且我有x :: X,我只能强迫Y如果我强制f x。在最近的一个问题/答案中,我探讨了X类型是无聊的情况":具体来说,我正在使用Data.Type.Coercion.Coercion

data Coercion a b where
  Coercion :: Coercible a b => Coercion a b

虽然Coercible a b约束意味着Coercion不是一个非常简单的数据构造函数,但强制系统确保Coercible a b字典总是由\x -> x表示,所以它几乎可能是无效的。

我的印象,我喜欢有人来验证或反驳,就是当一个函数的论据所有在这种意义上无聊时,那么应用这个函数只是一次,使用一组类型参数,并强制结果,允许所有类型参数的类型受信任。例如,鉴于Edward Kmett的

class Representational t where
  rep :: Coercion a b -> Coercion (t a) (t b)

我希望这有效:

type family A :: k
type family B :: k
coerceAB :: Coercion A B
coerceAB = unsafeCoerce (Coercion :: Coercion () ())

reallyRepresentational :: forall t . Representational t => Proxy t
reallyRepresentational = (rep coerceAB :: Coercion (t A) (t B)) `seq` Proxy

我想如果rep设法传递reallyRepresentational,那么time()的实现无法在任何非底部输入上失败。这是对的吗?

0 个答案:

没有答案