作为一般规则,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()
的实现无法在任何非底部输入上失败。这是对的吗?